M.M
M.M

Reputation: 13

How to write a bash shell script which takes one argument (directory name)

How to write a bash shell script called 'abc' which takes one argument, the name of a directory, and adds the extension ".xyz" to all visible files in the directory that don't already have it

I have mostly written the code which changes the filenames inside the current directory but I can't get the script to accept an argument (directory name) and change the filenames of that directory

#!/bin/bash
case $# in
0) echo "No directory name provided" >&2 ; exit 1;;
1) cd "${1}" || exit $?;;
*) echo "Too many parameters provided" >&2 ; exit 1;;
esac

for filename in *
do
echo $filename | grep "\.xyz$"
if [ "$?" -ne "0" ]
then mv "$filename" "$filename.old"        
fi
done

additional instructions include; Within 'abc', use a "for" control structure to loop through all the non-hidden filenames in the directory name in $1. Also, use command substitution with "ls $1" instead of an ambiguous filename, or you'll descend into subdirectories.

EDIT: The top part of the question has been answered below, however the second part requires me to modify my own code according to the following instructions:

Modify the command substitution that's being used to create the loop values that will be placed into the "filename" variable. Instead of just an "ls $1", pipe the output into a "grep". The "grep" will search for all filenames that DO NOT end in ".xyz". This can easily be done with the "grep -v" option. With this approach, you can get rid of the "echo ... | grep ..." and the "if" control structure inside the loop, and simply do the rename.

How would I go about achieving this because according to my understanding, the answer below is already only searching through filenames without the .xyz extension however it is not being accepted.

Upvotes: 1

Views: 3666

Answers (2)

M.M
M.M

Reputation: 13

The answer to the second part is this:

#!/bin/bash
for file in $(ls -1 "$1" | grep -v '\.old$'); do
mv "$file" "$file.old"
done

I got it from somewhere

Upvotes: 0

IanM_Matrix1
IanM_Matrix1

Reputation: 1594

Your description is a little unclear in places, so I've gone with the most obvious:

#!/bin/bash

# validate input parameters
case $# in
    0) echo "No directory name provided" >&2 ; exit 1;;
    1) cd "${1}" || exit $?;;
    *) echo "Too many parameters provided" >&2 ; exit 1;;
esac

shopt -s extglob # Enables extended globbing

# Search for files that do not end with .xyz and rename them (needs extended globbing for 'not match')
for filename in !(*.xyz)
do
    test -f && mv "${filename}" "${filename}.xyz"
done

Upvotes: 0

Related Questions