Script to remove spaces and mv a file

I've tried various solutions to move a file name with spaces and nothing seems to work. I need to take a date as input, prepend it to a filename with spaces then remove the spaces and mv the file to the new name.

#!/bin/ksh
#

if (( $# != 1 ))
then
   echo "Usage: `basename $0` <DATE> "
   echo ""
   exit 1
fi

echo " "
IN_DATE=${1}
IN_FILE="_test with space.txt"
echo "date ${IN_DATE}"

echo " "
oldFILE="$IN_DATE""$IN_FILE"

echo " "
newFILE=$(echo "$oldFILE" | sed 's/ /_/g')
echo "newFILE ${newFILE}"

echo " "
mv "${oldFile}" "${newFILE}"

which produces...

[INDENT]

space_test 20180419

date 20180419

oldfile 20180419_test with space.txt

newFILE 20180419_test_with_space.txt

mv: cannot stat ��: No such file or directory

I've also tried using awk to add single or double quotes around the original file name.

[INDENT]

oldFILE="$IN_DATE""$IN_FILE"
echo "oldfile ${oldFILE}"
origFILE=$(echo ${oldFILE} | awk '{print "\042"$0"\042"}')
echo "origfile ${origFILE}"

AND

oldFILE="$IN_DATE""$IN_FILE"
echo "oldfile ${oldFILE}"
origFILE=$(echo ${oldFILE} | awk '{print "\047"$0"\047"}')
echo "origfile ${origFILE}"

the echo shows the single or double quotes around the file name but I still get the same error on the mv.

oldfile 20180419_test with space.txt
origfile "20180419_test with space.txt"

oldfile 20180419_test with space.txt
origfile '20180419_test with space.txt'

I've also tried escaping the spaces with a \ but so far nothing that I've tried has worked. I get the same error. From the command line the mv works using ' or " or escaping the space with \.

Any suggestions?

In your first code sample, origFile is unset, thus empty, and mv doesn't find anything and complains as posted.
A caveat: the single quotes in the mv error message seem to be locale dependent - make sure you use ASCII characters for any input.

And, you might want to learn about shells' "parameter expansion / pattern substitution" to eliminate the sed stuff.

Thanks for the reply.

The {origFILE} on the mv was a cut and paste issue from trying different commands. With the mv command as

echo " "
mv "${oldFile}" "${newFILE}"

I receive

mv: cannot stat ��: No such file or directory

For the space substitution I've also tried tr, rename, and doing it in the mv command (mv "$oldFILE" "${oldFILE// /_}"). I will look where you suggested to see if there's other options I haven't tried yet.

Please post the result of

echo mv "${oldFile}" "${newFILE}"

for debugging purposes. Also, run the code with the -vx options set.

 bash -vx space_test 20180420
#!/bin/ksh
#

if (( $# != 1 ))
then
   echo "Usage: `basename $0` <DATE> "
   echo ""
   exit 1
fi
+ ((  1 != 1  ))

echo " "
+ echo ' '

IN_DATE=${1}
+ IN_DATE=20180420
IN_FILE="_test with space.txt"
+ IN_FILE='_test with space.txt'
echo "date ${IN_DATE}"
+ echo 'date 20180420'
date 20180420

echo " "
+ echo ' '

oldFILE="$IN_DATE""$IN_FILE"
+ oldFILE='20180420_test with space.txt'
echo "oldfile ${oldFILE}"
+ echo 'oldfile 20180420_test with space.txt'
oldfile 20180420_test with space.txt

echo " "
+ echo ' '

newFILE=$(echo "$oldFILE" | sed 's/ /_/g')
++ echo '20180420_test with space.txt'
++ sed 's/ /_/g'
+ newFILE=20180420_test_with_space.txt
echo "newFILE ${newFILE}"
+ echo 'newFILE 20180420_test_with_space.txt'
newFILE 20180420_test_with_space.txt

echo " "
+ echo ' '

mv "${oldFILE}" "${newFILE}"
+ mv '20180420_test with space.txt' 20180420_test_with_space.txt
mv: cannot stat �20180420_test with space.txt�: No such file or directory

exit
+ exit

---------- Post updated at 01:37 PM ---------- Previous update was at 01:24 PM ----------

I found the typo. I had not used the -vx options before they helped me see the problem. Thanks!

oldFILE != oldFile

1 Like