[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: For Loops and Space in Names



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





[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]