0

この関数は、destinationDirectory 内のフォルダー名をループして、ファイル名の末尾にある最大の数値を検索し、その値をインクリメントして、その値を folderNameWithoutNumber の末尾に追加します。か、そうなると思った。バッシュ機能:

$backupFolderNumber=0
$1=$sourceDirectory
$2=$destinationDirectory
$3=$folderNameWithoutNumber
# The values when the function are called

backupDirectory() {
for currentFolder in $2/*
do
    backupFolderNumber=$(echo $currentFolder | tr -cd '[[:digit:]]')
done
let backupFolderNumber+=1
cp -r $1 $2/$3$backupFolderNumber
echo "Backup complete."
}

この関数が最初の 10 回呼び出されると、最初の 10 個のバックアップが /path/to/backups/folderName_1、/path/to/backups/folderName_2、... /path/to/backups/folderName_10. 関数が再度呼び出されると、/path/to/backups/folderName_11 は作成されません。

私の最初の質問は、なぜこれが思ったように機能しないのですか (folderName_11 の作成とカウント)?

2 番目の質問は、数値部分を 3 桁の長さ (folderName_001、folderName_002) にするために、ファイル名の前にゼロを含めるようにフォーマットするにはどうすればよいかということです。

3 番目で最後の質問です。宛先には、同じ名前の同じフォルダーのバックアップのみを含める必要があるため、グループ内の最後のフォルダーには最新 (最大) の番号が必要です。なんらかの理由でフォルダがソートされていない場合に、最大数が確実に見つかるようにするにはどうすればよいでしょうか?

4

1 に答える 1

3

Bash には、2 番目の質問に答えるのに役立つprintf関数があります。

backupFolderNumber が整数の場合は、次を使用できます。

paddedFolderNumber=$(printf "%03d" $backupFolderNumber)

%03d 構文は、printf に、 backupFolderNumberの長さが 3 文字未満の場合はゼロを埋め込んで、少なくとも 3 文字の長さとして数値を出力するように指示します。

folder_name001 という形式の名前のフォルダーがある場合、現在のコード、

backupFolderNumber=$(echo $currentFolder | tr -cd '[[:digit:]]')

つまり、let ステートメントが 8 の 8 進数と見なす 010 が返され、backupFolderNumberが 11 や 011 ではなく 9 になります。

現在のフォルダー名から番号を取得するときに、パディングされていない番号を取得する1つの解決策は次のとおりです。

backupFolderNumber=$(echo $currentFolder | tr -cd '[[:digit:]]' | sed -e 's/^0\{1,2\}//')

ここで、sed は 1 つまたは 2 つの先行ゼロを取り除きます (このように、シーケンス 000 は何も返さずに 0 を返します)。

于 2012-09-12T17:04:13.110 に答える