これに頭を悩ませています。バックアップの作成日を含むこのディレクトリ内のファイルで、いくつかのディレクトリを順序付けしようとしています。
これはバックアップを順序付けるためのものですが、ディレクトリの 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
これを配列に入れる方法はかなり簡単ですが、結果をループなどに渡すことができるため、おそらくその必要はないでしょ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
。パターンの末尾のグロビング修飾子は、最後に変更された一致が最初になるように一致を並べ替え (これが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'