Files
使用參考更改許多文件的最後修改日期
我已經執行了備份並在還原它時,不幸的是,所有文件訪問時間都設置為此還原過程的 DateTime 的時間戳。現在如何將
/mount/backup/user
具有相同文件夾目錄結構的備份(例如)中的所有時間戳設置到我目前的系統(/home/user
)中,但僅適用於備份後我沒有更改的文件?(2021 年 1 月 11 日)帶有touch參考選項的東西?
$ man touch -r, --reference=FILE use this file's times instead of the current time
像這樣的複雜陳述似乎有效
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
(不知道為什麼不需要 -z 選項,即使存檔是使用 gzip 壓縮的)
此數據採用 ASCII 表格格式,以空格分隔。不幸的是
cut
不能以可變間距操作,但awk
可以。以下過程執行順利(除了一些帶有美元或撇號或括號的難看文件名)。這可以通過使用
fgrep
而不是部分修復,grep
但實際上它也是 find 的輸出{}
,當文件名包含例如美元符號或撇號時被剝離。導航到實時系統的文件夾,然後:
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 .
Edit2:使用正確的語法轉義(單撇號)有時很困難。
Edit3:此命令可以在任何子文件夾中執行,這可能會導致備份查找中出現非唯一匹配,因此也會報告:
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' \;