For Loops and Space in Names
Robert Wuest
rwuestfc at wuest.org
Wed Dec 10 22:05:27 UTC 2008
On Tue, 2008-12-09 at 18:53 -0600, Dave Ihnat wrote:
> On Wed, Dec 10, 2008 at 11:17:05AM +1100, Cameron Simpson wrote:
> > is totally reliable and does not need $IFS hacking (which amounts to
> > "guess a char I might not see in a filename).
>
> Hmm...I don't have as much problem with it, but that may be because
> since I started using Unix around 1980, using IFS to parse records has
> been a useful tool. Something like:
>
> SAVIFS=$IFS
> IFS=:
>
> while read INLINE </etc/passwd
> do
> set $INLINE
> (process fields)
> done;
> IFS=$SAVIFS
>
> (Yeah, if it gets too complicated, shift to awk.)
Spaces have always been one of my pet peeves and I find this discussion
rather interesting. Spaces don't belong in filenames and they make
script writing a pain. I'm going to include a script I wrote a long
time ago to handle the problem of junk characters in music files. Even
buying music online from Amazon will get you spaces in filenames :(
I remember messing with this little script quite a bit before it worked.
One lesson I learned writing this was to use lot's of double quotes.
The script replaces spaces (and other things) in filenames. I just put
it up here as an example since it's pretty short. I seem to use it a
lot.
The main for loop is:
for i in *; do
fixname "$i"
done
Notice the quotes around "$i". They're important.
Robert
#!/bin/bash
#
# fixmp3names
# Copyright (c) 2000, by Robert Wuest
# Permission is granted to use, modify and, distribute according
# to the terms of the GPL
#
# This script fixes a lot of the anomalies in file names
# usually weird stuff from mp3 files, but it's really generic
#
# if called with no args it processes all files in the current directory
# or works on the names passed on the command line
# probably doesn't work across directories
#
# just writes the mv commands to standard out
# if you want it to actually do something, pipe the output to sh, as in:
# fixmp3names | sh
#
IFS=$'\n'
function fixname()
{
newname=`echo $1 | \
sed -r \
-e "s/[ ]+/_/g" \
-e "s/[_]+/_/g" \
-e "s/'//g" \
-e "s/[+]//g" \
-e "s/,//g" \
-e "s/_-_/-/g" \
-e "s/\&/and/g"`;
# only do rename if the name is changed
if [ \"$1\" != \"${newname}\" ]; then
echo mv \"$1\" \"${newname}\"
else
echo "# \"$1\" and \"${newname}\" are the same file"
fi
}
if [ "$#" == "0" ]; then
for i in *; do
fixname "$i"
done
else
while [ "z$1" != "z" ]; do
fixname "$1"
shift
done
fi
exit
More information about the fedora-list
mailing list