Skip to content
Advertisement

Why cant I get mv to rename and copy file?

The last thing I want to do in this script is take the userinput to rename the corresponding files to include .bak extension rather then .txt which will copy into a backup directory. I keep receiving an error messaging saying e.g.

mv: cannot stat '5.bak': No such file or directory

The snippet in question (right at the bottom of full code):

for i in ~/students/Stu$userinput/*_$userinput.txt;
do
        mkdir -p ~/students/Backup; mv -- "$i" "${userinput%.txt}.bak" ~/students/Backup; #Change extension.

done

Full code:

#!/bin/bash

echo "Current User:  $USER"  >> system_info.txt #Inputs current user in .txt file.
echo "Current Directory:  $PWD"  >> system_info.txt #Inputs current user directory in .txt file.

#Creating the directory structure in the users home directory.
for i in {1..20}; #Create sub-directory of Stu from 1 to 20.
do
        mkdir -p archive students/Stu${i}; #Two new dirctories created, with Stu having sub directories represented by {i},
done


i=1 #{i} to begin at 1.
until ((i>20)) #Each loop to check if i is greater than 20.
do
        touch ~/students/Stu${i}/Notes_$i.txt #Creates a Notes page for every i up to 20.
        touch ~/students/Stu${i}/Results_$i.txt #Similarily, creates a txt file for Results_$ up untill 20.
        ((i++))
done

for i in {1..20}; do #This is to echo the required sentence howcasing the current filename, user in the corresponding directory.
        filename=~/students/Stu${i}/Notes_$i.txt
        touch "$filename"
        echo "The $(basename -- "$filename") file belonging to $USER was created in the Stu${i}." >> ~/students/Stu${i}/Notes_$i.txt
done

for i in {1..20}; do #This is to echo the required sentence howcasing the current filename, user in the corresponding directory.
        filename=~/students/Stu${i}/Notes_$i.txt
        touch "$filename"
        echo "The $(basename -- "$filename") file belonging to $USER was created in the Stu${i}." >> ~/students/Stu${i}/Notes_$i.txt
done

for i in {1..20}; do
        file_name=~/students/Stu${i}/Results_$i.txt
        touch "$file_name"
        echo "The $(basename -- "$file_name") file belonging to $USER was created in the Stu${i}." >> ~/students/Stu${i}/Results_$i.txt
done

while true;
do
        echo -n "File to change: "
        read userinput #Sets variable

if [ "$userinput" -ge 1 ] && [ "$userinput" -le 20 ];then #If userinput is greater than or equal to 1 or lss than or equal to 20/
        echo "Valid number! File changed." #If fits crities, let user kniw
break
else #If critriea doesnt meet, try again.
        echo "Invalid! File number must be between 1-20. Please try again."
        fi
done

for i in ~/students/Stu$userinput/*_$userinput.txt;
do
        mkdir -p ~/students/Backup; mv -- "$i" "${userinput%.txt}.bak" ~/students/Backup; #Change extension.

done


echo $?


Advertisement

Answer

The correct one would be

cp $i ~/students/Backup/$(basename ${i%.txt}.bak);

Note: mkdir -p ~/students/Backup is not needed to put in the loop

User contributions licensed under: CC BY-SA
5 People found this is helpful
Advertisement