Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

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,$_);
    }
}