ありがとうございました。私は解決策を見つけて、他の誰かがこれを見ている場合に私がここに投稿するかもしれないと考えました。 タイトルが示唆しているように、元のディレクトリツリー(ファイルのソースとアーカイブの場所はスクリプトのユーザによって指定される)を保持したまま、複数のファイルをコピーして名前を変更するLinuxシェルスクリプトが必要でした。ここで私は、さまざまなソースの数日の調査の後に思い付いたコードは(それがこれだけのスクリプトの1つのインスタンスが同時に実行されるだろうトラップを含みます)です。
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’’
\t echo "$1" "is not a directory"
\t echo ""
\t exit
else
\t if [ ! -d "$2" ]; then #testing if second entry is a valid directory
\t \t echo "archive directory non existant"
\t \t exit
else
\t 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
\t \t echo "such folder already there and it's not empty"
\t \t exit
else
\t if [ ! -d "$findir" ] ; then #last archive directory argument to create final archive directory
\t mkdir "$findir"
\t else true
\t fi
\t fi
\t 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
\t counter="$((counter+1))" #incrementation variable
\t source_name="$(basename "$1")" #variable that captures the name of the source directory
\t new_name="$source_name"_"$counter" #variable that puts start of the file name and incrementation element together
\t if echo "$file" | grep "\." #argument that captures the extension of the file
\t \t then
\t \t \t extension="$(echo "$file" | cut -f2 -d.)"
\t \t else
\t \t \t extension=
\t fi
\t 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
これではありませんコードライティングサービス。あなたは、番号をつけ直すものを追加しようとします。私たちは多分、それを修正しようと試みます。 –
@Marc建設的な批判のおかげで。私はいくつかのポストとスタックオーバーフローの答えと私の道を失った;)によって誤解された;) –