Linux shell脚本,用于复制和重命名多个文件

时间:2016-10-21 16:07:56

标签: shell

我有这个片段:

#!/bin/bash
parent=/parent
newfolder=/newfolder
mkdir "$newfolder"
for folder in "$parent"/*; do
if [[ -d $folder ]]; then
foldername="${folder##*/}"
for file in "$parent"/"$foldername"/*; do
filename="${file##*/}"
newfilename="$foldername"_"$filename"
cp "$file" "$newfolder"/"$newfilename"
done
fi
done

我确实需要以复制文件在移动到的文件夹后命名的方式进行转换(例如,移动到/ root / Case22文件将重命名为case22_1.jpg,case22_2.docx, case22_3.JPG等)。将从USB复制文件,并且用户将输入目标和源目录。我已经编写了其他所有内容,除了实际重命名之外它还有效,我想我可以调整这个代码片段。

感谢

P.S。该片段由Jahid编写并在stackoverflow上找到

2 个答案:

答案 0 :(得分:1)

你可以尝试这样的事情;

#!/bin/bash
parent=/root
a=1
for file in $parent/Case22*; do
filename="${file%.*}"
extension="${file##*.}"
  newfilename=$(printf "$filename"_"$a"."$extension") 
  mv -- "$file" "$newfilename"
  let a=a+1
done

答案 1 :(得分:0)

感谢您的帮助。我找到了解决方案,并认为我可能会在这里发布,万一其他人会看到这个。 正如标题所示,我需要一个Linux shell脚本来复制和重命名保存原始目录树的多个文件(文件源和存档位置将由脚本用户指定)。以下是我在对不同来源进行了几天研究后得出的代码(它包含一个陷阱,因此一次只运行一个脚本实例):

lockdir=/var/tmp/mylock         #directory for lock file creation
pidfile=/var/tmp/mylock/pid     #directory to get the process ID number


if ( mkdir ${lockdir} ) 2> /dev/null; then      #main argument to create lock file 
        echo $$ > $pidfile      #if successful script will proceed, otherwise it will skip to the else part of the statement at the end of the script
        trap 'rm -rf "$lockdir"; exit $?' INT TERM EXIT #trap to capture reasons of script termination and removal of the lock file so it could be launched again
        #start of the main script body, part of successful "if" statement 


#        read entry_for_testing_only #request for user entry to keep script running and try to run another script instance


        findir="$2/$(basename "$1")" #variable that defines final directory to which files from USB will be copied

        if [ ! -d "$1" ]; then #testing if first directory entry is a valid directory’’
	        echo "$1" "is not a directory"
	        echo ""
	        exit
        else
	        if [ ! -d "$2" ]; then #testing if second entry is a valid directory
		        echo "archive directory non existant"
		        exit
        else 
	        if [ -d "$findir" ] && [ "$(ls -A "$findir")" ]; then #testing if second entry directory contains the same name folders and if the folders are empty - to avoid file overwriting
		        echo "such folder already there and it's not empty"
		        exit
                else 
	                if [ ! -d "$findir" ] ; then #last archive directory argument to create final archive directory
	                        mkdir "$findir"
	                else true
	                fi
	        fi
	        fi
        fi

        rsync -a "$1"/ "$findir" #command to copy all files from the source to the archive retaining the directory tree


        moved_files="$(find "$findir" -type f)" #variable that finds all files that have been copied to the archive directory


        for file in $moved_files; do #start of the loop that renames copied files
	        counter="$((counter+1))" #incrementation variable
	        source_name="$(basename "$1")" #variable that captures the name of the source directory
	        new_name="$source_name"_"$counter" #variable that puts start of the file name and incrementation element together
	        if echo "$file" | grep "\." #argument that captures the extension of the file
		        then 
			        extension="$(echo "$file" | cut -f2 -d. )"
		        else
			        extension=
	        fi
	        full_name="$new_name"."$extension" #variable that defines the final new name of the file
                dir="$(dirname "${file}")" #variable that captures the directorry address of currently looped file
                mv "$file" "$dir/$full_name" #move command to rename currently looped file with the final new name
        done

        #end of the main script body, unsuccessful "if" statement continues here
else
        echo "Another instance of this script is already running. PID: $(cat $pidfile)"
fi