このディレクトリ内のファイルの日付文字列でディレクトリを並べ替える

このディレクトリ内のファイルの日付文字列でディレクトリを並べ替える

これに頭を悩ませています。バックアップの作成日を含むこのディレクトリ内のファイルで、いくつかのディレクトリを順序付けしようとしています。

これはバックアップを順序付けるためのものですが、ディレクトリの 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

これらのディレクトリをcreation_time文字列で並べ替えて配列に格納するスクリプトを作成するにはどうすればよいでしょうか。

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。パターンの末尾のグロビング修飾子は、最後に変更された一致が最初になるように一致を並べ替え (これが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'

関連情報