Question
Hello. I am having a bit of trouble with my program. We only need to insert a few functions into a partially completed Bash Shell
Hello. I am having a bit of trouble with my program. We only need to insert a few functions into a partially completed Bash Shell Scripting Program. It's stuck not accepting my arguments. Either it doesn't think my input is a directory, or it doesn't think my input exists at all. Below are the instructions, and below that is the program with my code inserted.
INSTRUCTIONS:
The student is to modify the script student-example-p3 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 be dashes instead of spaces. 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
-d Both -d and and -f may be specifed.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 ./C D/E F/G H/J ./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
Here is a copy of the script - it is also as an attachment in both UNIX and Windows format.
the -f says to only rename files
the -d says to only rename directories
K K/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 # if you change this to echo, remove the -- print -- "${1%/*}" }
basename ()
{# function provided for the student # if you change this to echo, remove the -- 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 after the function is coded }
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 after the function is coded }
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 after the function is coded }
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
elseDIR="$1"
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
MY CODE:
#!/bin/bash
############################################################################### # # Description: this script will change the name of # files/directories with spaces in the name to be dashes instead # of spaces. # # The options to the script are as follows: # -f rename files # -d rename directories # Both -d and and -f may be specifed. #
# USAGE INFORMATION USAGE="$0 -f directory $0 -d directory $0 -d -f directory -f rename files -d rename directories " # FUNCTIONS ############################################################################### usage () { echo "$USAGE" exit 1 }
pathname () { # function provided for the student echo "${1%/*}" }
basename () { # function provided for the student echo "${1##*/}" }
find_dirs () { # function provided for the student find "$1" -depth -type d -name '* *' | cat }
find_files () { # function provided for the student find "$1" -depth -type f -name '* *' | cat } ############################################################################### ############################################################################### # *** MY CODE *** # 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 ############################################################################### my_rename(){ # Take the directories from the positional arguments FROM="$1" TO="$2" # If the directory is NOT writable, output error and exit. if [ ! -w "${FROM}" ] then echo "Directory or File ${FROM} is NOT WRITABLE!"; exit 1 fi # If the target directory already exists, output error and exit. if [ -d "$TO" ] then echo "Target File or Directory $TO ALREADY EXISTS!"; exit 1 fi # Otherwise, rename directory. mv "$FROM" "$TO" # Set exist status equal to status. If exists, output error. STATUS=$? if [ $STATUS -ne 0 ] then echo "Error moving the file or directory $FROM to $TO"; fi }
############################################################################### # *** MY CODE *** # 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 ###############################################################################
fix_dirs (){ # Find directories and read all find_dirs "$1" | while read -r oldDirectory; do # Set variable to new directory name. newDirectory=$(echo "$oldDirectory" | tr " " "-") # Call rename function my_rename "${oldDirectory}" "${newDirectory}" done }
############################################################################### # *** MY CODE *** # # 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 ###############################################################################
fix_files (){ # Find file and read all find_files "$1" | while read -r oldFile; do # Set variable to new file name newFile=$(echo "$oldFile" | tr " " "-") # Call rename function my_rename "${oldFile}" "${newFile}" done } ############################################################################### ###############################################################################
# BEGINNING OF MAIN PROGRAM ############################################################################## while [ $# -gt 0 ] do case $1 in -d) WDIR=1 ;; -f) WFILE=1 ;; -*) usage ;; *) if [ -d "$1" ] then DIR="$1" else echo "$1 does not exist ..." >&2 exit 1 fi ;; esac shift done
WFILE= WDIR= DIR=
# Check if # If directory not properly specified, output error if [ "$#" == "0" ] then usage fi
############################################################################### # *** MY CODE *** # 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 [ ! -d "$DIR" ] then echo "Error: Directory not specified!" exit 1 elif [ "$DIR" == "$PWD" ] then echo "Error: Directory specified is the current directory!" exit 1 # Check if . or .. exist in directory path elif [ ! "$(echo "$DIR" | grep -c ".")" -eq "0" ] && [ ! "$(echo "$DIR" | grep -c ".")" -eq "0" ] then echo "Error: Please remove any . or .. in directory path!" exit 1 elif [ "$WFILE" -eq 0 ] && [ "$WDIR" -eq 0 ] then echo "Error: Flags not specified!" usage fi
############################################################################### ############################################################################### if [ "$WDIR" -a "$WFILE" ] then fix_files "$DIR" fix_dirs "$DIR" elif [ "$WDIR" ] then fix_dirs "$DIR" elif [ "$WFILE" ] then fix_files "$DIR" fi
Step by Step Solution
There are 3 Steps involved in it
Step: 1
Get Instant Access to Expert-Tailored Solutions
See step-by-step solutions with expert insights and AI powered tools for academic success
Step: 2
Step: 3
Ace Your Homework with AI
Get the answers you need in no time with our AI-driven, step-by-step assistance
Get Started