参照を使用して多くのファイルの最後の変更日を変更する

参照を使用して多くのファイルの最後の変更日を変更する

バックアップを実行して復元しましたが、残念ながら、すべてのファイルアクセス時間は復元プロセスの日付/時刻のタイムスタンプに設定されています。これで、フォルダディレクトリ構造は/mount/backup/user同じバックアップ(たとえば)のすべてのタイムスタンプを現在のシステム(/home/user)に設定できますが、バックアップ後に変更されていないファイルに対してのみ設定できますか? (2021年1月11日基準)

何かで触れる参照オプション?

$ man touch
-r, --reference=FILE
              use this file's times instead of the current time

答え1

このような複雑な宣言が機能しているようです。

find . -mtime +225 -exec sh -c 'echo "\n" && echo File = "{}"; bkf="/mount/backup/{}"; echo Backupfile = \""${bkf}"\" . ; test -f "$bkf" && echo do the touch && echo okok ; echo end' \;

ここで、225はこれからバックアップまでの日数です(とにかく丸められます)。引用する)

find説明はとてもexec良いですここ

編集する: お持ちの場合tar/tar.gz アーカイブを使用したバックアップ、すべてのファイルを抽出する必要はありませんが、cdバックアップして次のコマンドを実行するだけです(参照: tar 内容のリスト)バックアップ内のすべてのファイルのメタデータをインポートします。

for f in *.tar.gz ; do echo $f; tar -v -t -f $f > "/tmp/contents_backup-20200401/$f.txt"; done

(gzip圧縮アーカイブにも-zオプションが必要ない理由はわかりません)

データはASCII表形式であり、スペースで区切られます。残念ながら、可変cut間隔では動作できません。awk できる

次のプロセスは円滑に実行されます(ドル、アポストロフィ、または括弧を含むいくつかの見苦しいファイル名を除く)。これを使用して部分的に変更できますが、実際にfgrepファイル名にドル記号またはアポストロフィが含まれている場合は、grepfindの出力も削除されます。{}

ライブシステムのフォルダに移動したら、次の操作を行います。

find  *  -type f  -mtime +244   -exec sh -c  'echo "\n" && echo File = "{}"; lastmod=$(stat -c %y "{}" |cut -c-16); echo "LastMod TimeStamp = \""$lastmod"\"" ; dt=$(echo "$lastmod" | cut -c-10) && [ "$dt" = "2020-07-10" ] && ( echo "old file detected" ; timestamp=$(fgrep "{}" /tmp/contents_backup-20200401/backup-musik.tar.gz.txt  | head -n1 | awk -F" " '"'"'{ print $4 " " $5 }'"'"' ); echo "Backup TimeStamp  = \""${timestamp}"\"" . ; test -n "$timestamp" && echo "do the touch" && touch -d "$timestamp" "{}"; echo "ret=$?" && echo okok ) ; echo end' \;

したがって:

  • 244バックアップ後の日数(最初のフィルタで)。
  • 2020-07-10ハードコードされた日付なので、その日付のファイルだけが影響を受けます。
  • /tmp/contents_backup-20200401/backup-musik.tar.gz.txt上記のコマンドで生成されたファイルです。

このコマンドの機能は次のとおりです。

  • ライブシステムのファイルを繰り返します。
  • 無効な日付の問題の影響を受けていることを確認してください(古い、バックアップ後に変更されていないため、タイムスタンプをリセットしたくありません)。
  • バックアップリストでその項目を見つけて見つけます。 (残念ながら、フォルダには多くのファイルがあるため、フォルダ*では機能しません。)
  • 以下を使用してawkバックアップファイルのタイムスタンプを取得します。
  • 報告成功

*) フォルダの日時は、以下を使用して設定できます。このコマンドそのフォルダの最新のファイルに基づいています(実際には、すべてのフォルダに繰り返し適用する必要があります)。

stat -c %y . && touch -r "$(find -mindepth 1 -maxdepth 1 -printf '%T+=%p\n' | sort |tail -n 1 | cut -d= -f2-)" . && stat -c %y .

編集2:エスケープ(単一アポストロフィ)正しい構文を使用することは時々難しいかもしれません。

編集3:このコマンドはすべてのサブフォルダで実行できます。これにより、バックアップクエリで一意でない一致が発生する可能性があるため、この内容も報告されます。

find  *  -type f  -mtime +244   -exec sh -c  'echo "\n" && echo File = "{}"; lastmod=$(stat -c %y "{}" |cut -c-16); echo "LastMod TimeStamp = \""$lastmod"\"" ; dt=$(echo "$lastmod" | cut -c-10) && [ "$dt" = "2020-07-10" ] && ( echo "old file detected" ; filelist=$(fgrep "{}" /tmp/contents_backup-20200401/backup-dokumente.tar.gz.txt); filecount=$(echo "$filelist"|wc -l); echo "file count = $filecount"; [ "$filecount" -gt "1" ] && echo "multiple files found" ; timestamp=$(echo "$filelist" | head -n1 | awk -F" " '"'"'{ print $4 " " $5 }'"'"' ); echo "Backup TimeStamp  = \""${timestamp}"\"" . ; [ $(echo -n "$timestamp" | wc -m) = 16 ] && echo "do the touch" && touch -d "$timestamp" "{}"; echo "ret=$?" && echo okok ) ; echo end' \;

関連情報