Need help with this assignment: The student is to modify the script following th
ID: 3678935 • Letter: N
Question
Need help with this assignment:
The student is to modify the script following the instructions in the script.
The purpose of this script is to change the name of files/directories with spaces in the name to have a dash(-). So if a file/directory were named "A B", the new name would be A-B. The script will work on a directory specified on the command line and replace the spaces in the names for all files/directories underneath that directory.
The options to the script are as follows:
-f the -f says to only rename files
-d the -d says to only rename directories
Both -d and and -f may be specifed.
<directory-name> the name of the directory that you will be processing.
For example:
Given the following
$ ls
C D/                dirs.tar            fix-spaces*
And the directory "C D" contained the following structure
./C D
./C D/E F
./C D/E F/G H
./C D/E F/G H/JÂ Â Â K
./C D/E F/G H/JÂ Â Â K/a b
./C D/E F/G H/a b
./C D/E F/a b
./C D/a b
After the script was run,
fix-space -f -d "C D"
the directory structure would be as follows:
C-D
C-D/E-F
C-D/E-F/G-H
C-D/E-F/G-H/a-b
C-D/E-F/G-H/J----K
C-D/E-F/G-H/J----K/a-b
C-D/E-F/a-b
C-D/a-b
#!/usr/bin/ksh
USAGE="$0 -f directory
$0 -d directory
$0 -d -f directory
-f rename files
-d rename directories
"
usage ()
   {
   print -u2 "$USAGE"
   exit 1
   }
pathname ()
   {
   # function provided for the student
   print -- "${1%/*}"
   }
basename ()
   {
   # function provided for the student
   print -- "${1##*/}"
   }
find_dirs ()
   {
   # function provided for the student
   find "$1" -depth -type d -name '* *' -print
   }
find_files ()
   {
   # function provided for the student
   find "$1" -depth -type f -name '* *' -print
   }
my_rename()
   {
   # the student must implement this function to my_rename
   # $1 to $2
   # The following error checking must happen:
   # 1. check if the directory where $1 resided is writeable,
   #     if not then report an error
   # 2. check if "$2" exists -if it does report and error and don't
   #     do the mv command
   #  3. check the status of the mv command and report any errors
   : # remove this line when you implement the function
   }
fix_dirs ()
   {
   # The student must implement this function
   # to actually call the my_rename funtion to
   # change the name of the directory from having spaces to
   # changing all of the spaces to -'s
   # if the name were "a b", the new name would be a-b
   # if the name were "a  b" the new name would be a----b
   : # remove this line when you implement the function
   }
fix_files ()
   {
   # The student must implement this function
   # to actually call the my_rename funtion to
   # change the name of the file from having spaces to
   # changing all of the spaces to -'s
   # if the name were "a b", the new name would be a-b
   # if the name were "a  b" the new name would be a----b
   : # remove this line when you implement the function
   }
WFILE=
WDIR=
DIR=
if [ "$#" -eq 0 ]
  then
  usage
  fi
while [ $# -gt 0 ]
   do
   case $1 in
   -d)
       WDIR=1
       ;;
   -f)
       WFILE=1
       ;;
   -*)
       usage
       ;;
   *)
if [ -d "$1" ]
   then
   DIR="$1"
else
   print -u2 "$1 does not exist ..."
   exit 1
   fi
;;
   esac
   shift
   done
# The student must implement the following:
# - if the directory was not specified, the script should
#Â Â print a message and exit
# - if the Directory specified is the current directory, the script
#Â Â print a error message and exit
# - if the directory specified is . or .. the script should print
#Â Â an error message and exit
# - if both -f and -d are not specified, the script should print a
#Â Â message and exit
#
if [ "$WDIR" -a "$WFILE" ]
   then
   fix_files "$DIR"
   fix_dirs "$DIR"
elif [ "$WDIR" ]
   then
   fix_dirs "$DIR"
elif [ "$WFILE" ]
   then
   fix_files "$DIR"
   fi
Explanation / Answer
#!/usr/bin/perl
&Space_dash(`find . -type d`);
&Space_dash(`find . -type f`);
sub Space_dash
{
   ($elements)=@_;
   @t=split / /,$elements;
   for $e (@t)
   {
   $_=$e;
   s/^.///;
   # non ascii transliterate
   tr [€-ÿ][_];
   tr [- ][_];
   # special characters we do not want in paths
   s/[ -,;?+'"![]()@#]/_/g;
   # multiple dots except for extension
   while (/..*./)
   {
       s/./_/;
   }
   s/_+/_/g;
   next if ($_ eq $e ) or ("./$_" eq $e);
   print "$e -> $_ ";
   Space_dashline ($e,$_);
   }
}