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

yet another bash question



For things like saving photos to hard disk, I tend to use a few bash scripts
to rename the files, keeping the numerical part and coding something else in
place of the "cimg".  For example, I might change all the files cimg1234.jpg
to cimg1299.jpg to be called foobar234.jpg to foobar299.jpg. I tend to
modify these scripts when need arises, but the latest one shows an oddity I
cannot understand.  

The script (called prep) is inline below. It removes $1 from the beginning
of any filename in pwd and replaces it with $2, subject to a couple of
sanity checks.
 
Here is the output from a test run:
--------
richard@scatola:~/test$ ls
ohdear  ohwonderful  oops  oopsdeardear  tutdear
richard@scatola:~/test$ prep oops wer

... working
    oops  ->  wer
    oopsdeardear  ->  werdeardear
            2 renamed --all done.

richard@scatola:~/test$ ls
ohdear  ohwonderful  tutdear  wer?  werdeardear
--------
My question is:  where did the question mark come from? It always occurs if
the whole filename is substituted.

Of course, someone will tell me there is a standard unix command to do
this...

richard

--------here is the script:
#!/bin/bash
# 
prep
# in present working directory, remove occurrences of a string at the start of
# any filenames, and replace it by another string, subject to avoiding
# duplicate or empty filenames

# USAGE: prep [stringtoreplace [newstring] ]

# have we an old string?
if [ -n "$1" ] ; then
  old="$1" ;
  # if not, we ask for it
else
  echo "enter initial string to be replaced " ;
  read -p "(if you leave this blank, new string will be prepended): " old ;
fi
lenold=${#old}
#have we got a string to substitute?
if [ -n "$2" ] ; then
  pre="$2" ;
  # if not, get string
else
  if [ -z "$old" ] ; then
    prmpt="prepend" ;
    echo "you will prepend all filenames in pwd," ;
  else
    prmpt="substitute" ;
    echo "you will replace the initial string '$old' of filenames in pwd," ;
  fi
  read -p " -- enter new string to $prmpt: " pre ;
fi

# and do the job
echo ;
echo "... working"
for f in $old* ; do
  nowf=`basename "$f"`;
  subf="$pre${nowf:lenold}";
  if [ -n "$subf" ] ; then
    if [ -e "$subf" ] ; then
      echo "    $f not renamed because $subf already exixts"
    else
      echo "    $f  ->  $subf"
      mv "$f" "$subf"
      nr=$((co ++))
    fi
  else
    echo "    $f not renamed to blank name"
  fi
done
echo "            $co renamed --all done."
echo ;
--------end of script





Reply to: