このため頭が痛いですね。バックアップの作成日を含むそのディレクトリのファイルに基づいて複数のディレクトリを並べ替えようとしています。
これはバックアップを注文するためのものです。同時に別のホストにコピーされるため、ディレクトリのctimeまたはatimeを使用してこれを行うことはできません。
次のような構造があるとしましょう。
/backups/full
/backups/incremental1
/backups/incremental2
/backups/incremental3
...
これらのバックアップディレクトリには次のものがあります。
/backups/full/date.txt
/backups/incremental1/date.txt
/backups/incremental2/date.txt
..
このdate.txt
ファイルにはそれぞれの文字列がありますcreation_time = 2020-04-03 15:26:19
。
生成時間文字列に基づいてこれらのディレクトリをソートして配列に配置するスクリプトをどのように作成できますか?
array=(full incremental1 incremental2 incremental3)
for dir in @{array[@]}; do
変数や配列でソートしたいです。
答え1
構造がdate.txt
常に同じで、ディレクトリ名に改行文字が含まれていないと仮定すると、次のようにします。
for d in /backups/*/date.txt; do
printf '%s\t%s\n' "$(grep creation_time "$d")" "$(basename "$(dirname "$d")")"
done | sort | cut -f2-
出力:
full
incremental1
incremental2
incremental3
これを配列に入れるのはとても簡単ですが、結果をループなどで供給できるので、おそらく必要ありませwhile
んxargs
。
答え2
date.txt
シェルでファイルの最後に変更されたタイムスタンプを使用しますzsh
。
for backupdir in /backup/*/date.txt(ome['REPLY=$REPLY:h']); do
# do whatever you need to do
# with the directory path in $backupdir
done
ワイルドカードパターンを使用してすべてのファイルを一致させますdate.txt
。パターンの末尾にあるglobbing修飾子は、最後に変更された一致が最初になるように一致をソートし(これを行います)、om
一致するパス名から文字列を削除します(そうなります)。/date.txt
dirname
これは明らかに、date.txt
日付が記録された時間(バックアップが実行されたのとほぼ同じ時間)にファイルが更新されたと仮定します。複製されたデータを使用すると、このタイムスタンプ(ディレクトリタイムスタンプとともに)が保存されますrsync --archive
。
からbash
:
zsh -c '
for backupdir in /backup/*/date.txt(ome['\''REPLY=$REPLY:h'\'']); do
# do whatever you need to do
# with the directory path in $backupdir
done'