APLawrence.com -  Resources for Unix and Linux Systems, Bloggers and the self-employed

Printing multiple files


I have 25 .txt files that I would like to print. They are named 1.txt, 2.txt and so on. How can I do this?

I assume that "lpr *.txt" isn't suitable, either because there are other .txt files that you don't want to print or because you want the jobs to come out of the printer in a specific order.

You could do something like this:

lpr [1-9].txt 1[0-9].txt 2[0-5].txt

Or perhaps even:

lpr `ls *.txt | sort -n`

Too much typing? Assuming a current Bash, you can do:

lpr {1..25}.txt

That braces trick is even more powerful than that; see Bash 3.00 brace expansion.

Maybe you want some visual clue as to what's happening because it's 250 files, not 25. In that case, a loop will do it. You could use:

for i in {1..25} 
do echo "Now printing $i.txt"
lpr $i.tx


x=1;while [ $x -lt 26 ]; do  echo "Now printing $x.txt;lpr $x.txt; x=$((x+1));done

For conditions where it isn't ".txt" but something like file25foo, use "file${x}foo".

When it gets even more complicated, Bash extended globbing can be useful:

shopt -s extglob
lpr !([A-z]*.txt)

That prints everything that doesn't match [A-z]*.txt.

Test out patterns with "echo" before wasting a bunch of paper:

$ echo +(1*|3*)
1.txt 10.txt 11.txt 12.txt 13.txt 14.txt 15.txt 16.txt 17.txt 18.txt 19.txt 3.txt

Let's not forget where you want to add a title or whatever:

for in in {1..25} 
(echo "    This is $i.txt";cat $i.txt) | lpr

And of course we could get MUCH fancier if desired.


If your script is expecting to find certain files but does not, what happens?

for i in *.foo
lpr $i

That spits back '*.foo' and lpr would complain:

lpr: Error - unable to access "*.foo" - No such file or directory

That might be annoying. You could suppress stderr:

for i in *.foo
lpr $i 2>/dev/null

Or just avoid missing files:

for i in *.txt *.foo
if test -e $i
 then lpr $i

A shorter version:

for i in *.txt *.foo
test -e $i && echo $i

What if some of those files were not text? That could make a mess of your printer output tray, couldn't it? There's a "file" command that could help and also avoid wasting time on empty files.

for i in *.txt *.foo
test -n "`file $i | grep text`" && lpr $i

That avoids everything but 1.txt and 10.txt in this directory:

$ file *
1.txt:  ASCII text
10.txt: ASCII text
11.txt: empty
12.txt: JPEG image data, EXIF standard
13.txt: empty
14.txt: empty
15.txt: empty
16.txt: empty
17.txt: empty
18.txt: empty
19.txt: empty
2.txt:  empty
20.txt: empty
21.txt: empty
22.txt: empty
23.txt: empty
24.txt: empty
25.txt: empty
3.txt:  empty
4.txt:  empty
5.txt:  empty
6.txt:  empty
7.txt:  empty
8.txt:  empty
9.txt:  empty

Putting some of these ideas together could result in a pretty powerful script that would do exactly what you want in every case. However, I will add this: once it gets even slightly complicated, I turn to Perl. It's not that you can't do complex jobs with shell scripts, but that twisting around shell script limitations can get quite painful. I like to avoid that pain.

Got something to add? Send me email.

(OLDER)    <- More Stuff -> (NEWER)    (NEWEST)   

Printer Friendly Version

-> -> Printing multiple files

Increase ad revenue 50-250% with Ezoic

More Articles by

Find me on Google+

© Anthony Lawrence

Kerio Samepage

Have you tried Searching this site?

Unix/Linux/Mac OS X support by phone, email or on-site: Support Rates

This is a Unix/Linux resource website. It contains technical articles about Unix, Linux and general computing related subjects, opinion, news, help files, how-to's, tutorials and more.

Contact us

Securing a computer system has traditionally been a battle of wits: the penetrator tries to find the holes, and the designer tries to close them. (Gosser)

This post tagged: