使用引用更改许多文件的最后修改日期

使用引用更改许多文件的最后修改日期

我已经执行了备份并恢复它,不幸的是,所有文件访问时间都设置为该恢复过程的日期时间的时间戳。现在如何将/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:转义(单撇号) 使用正确的语法有时很困难。

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' \;

相关内容