我已经执行了备份并恢复它,不幸的是,所有文件访问时间都设置为该恢复过程的日期时间的时间戳。现在如何将/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
,但实际上当文件名包含美元符号或撇号时,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 .
编辑2:转义(单撇号) 使用正确的语法有时很困难。
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' \;