ugh.book

(singke) #1

156 csh, pipes, and find


Hmm, perhaps not so robust after all. Unix file names can have any
character in them (except slash). A space in a filename will break this
script, since the shell will parse it as two file names. Well, that’s not
too hard to deal with. We'll just change the IFS to not include Space
(or Tab while we're at it), and carefully quote (not too little, not too
much!) our variables, like this:

IFS='
'
for file in `ls -f`
do
if [ "$file" !=. -a "$file" != .. ]
then
file "$file"
fi
done

Some of you alert people will have already noticed that we have
made the problem smaller, but we haven't eliminated it, because
Linefeed is also a legal character in a filename, and it is still in IFS.

Our script has lost some of its simplicity, so it is time to reevaluate
our approach. If we removed the “ls” then we wouldn’t have to worry
about parsing its output. What about

for file in .* *
do
if [ "$file" !=. -a "$file" != .. ]
then
file "$file"
fi
done

Looks good. Handles dot files and files with nonprinting characters.
We keep adding more strangely named files to our test directory, and
this script continues to work. But then someone tries it on an empty
directory, and the * pattern produces “No such file.” But we can add
a check for that...

...at this point my message is probably getting too long for some of
your uucp mailers, so I'm afraid I'll have to close here and leave fix-
ing the remaining bugs as an exercise for the reader.

Stephen
Free download pdf