ディレクトリ内のファイルの日付文字列に基づいてディレクトリを並べ替える

ディレクトリ内のファイルの日付文字列に基づいてディレクトリを並べ替える

このため頭が痛いですね。バックアップの作成日を含むそのディレクトリのファイルに基づいて複数のディレクトリを並べ替えようとしています。

これはバックアップを注文するためのものです。同時に別のホストにコピーされるため、ディレクトリの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

これを配列に入れるのはとても簡単ですが、結果をループなどで供給できるので、おそらく必要ありませwhilexargs

答え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.txtdirname

これは明らかに、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'

関連情報