如何将文件时间戳增加 3 个月(对于目录树)?

如何将文件时间戳增加 3 个月(对于目录树)?

我正在查看touch命令行实用程序(在 Linux 上),并且从我在中找到的示例中教程,我了解如何将访问或修改时间戳更改为指定时间、当前时间或参考文件。

但是,我想执行以下操作:我的文件的相对年龄(相对于彼此)包含对我有价值的信息,我不想丢失这些信息。但我需要(递归)文件夹中的每个文件看起来比实际要年轻几个月。因此,每个文件都可以引用自身,增加时间,但将其应用于文件夹树中的每个文件。有什么好的方法可以做到这一点?

#!/bin/bash
FILES=$(find $HIGHEST_FOLDER -type f -name *.*)
for f in $FILES
do
  touch -ram f -F 7776000 f
  # bumping access and modification timestamps by 3 months?
done

或者我最好find -exec按照建议使用回答? (这些文件夹中有很多文件。)那怎么行?

答案1

假设你在 Linux 系统上,或者至少你有 GNUtouch和 GNU date,你可以这样做(在 bash 中;zsh是相同的,但不需要shopt globstar):

$ shopt globstar
$ for f in **; do 
    touch -d "$(date -d "$(stat -c '%y' "$f") +3 months")" "$f"
  done

但是,这将忽略隐藏文件。为了也匹配这些,请shopt -s dotglob在上述命令之前运行。

解释

  • shopt -s globstar:这设置了 bash 的globstar选项,这意味着**将匹配所有文件以及零个或多个目录和子目录。
  • shopt -s dotglob: 使*(和**) 也匹配名称以 . 开头的文件.
  • for f in **; do ...; done: 遍历所有文件和目录,将它们另存为$f.
  • stat -c '%y' "$f":这是当前文件或目录的当前时间戳。
  • date -d $(...) +3 months:打印给定字符串三个月后的日期(在本例中,该字符串是命令staton的输出$f)。

总之,上面将找到当前文件夹(包括所有子目录)中每个文件或目录的修改日期,并将其日期设置为现在的三个月后。

答案2

从问题的描述来看,我相信您正在寻找一个可以获取上次文件修改时间然后添加 3 个月的工具。你可以用stat+ touch+ 一些 shell 算术评估来做到这一点。例如,要在file时间戳上添加 90 天,您可以编写

touch -d "@$(( $(stat -c '%Y' file) + 90*24*3600 ))" file

然后循环遍历file您需要的所有内容。

答案3

我会使用-execfind - a oneliner 。

find $HIGHEST_FOLDER -type f -name '*.*' -exec touch -d "$(date -d "$(stat -c '%y' {}) +3 months")" {} \;

引用*.*,否则find将从当前目录获取文件名并失败。

最后,您必须指定\;,反斜杠后跟分号,-exec强制执行此操作。这{}是当前find找到的文件。

没有-F切换到 GNU touch,因此您的示例不起作用。还有多个语法问题:

在上面的 for 循环中,您需要将 f 更改为 $f:

touch [...] $f

否则,它将在当前目录中查找名为的文件f,并将其日期更改 x 次,其中 x 是$HIGHEST_FOLDER.

如果您坚持使用子外壳($(...)在循环之前),则必须确保$HIGHEST_FOLDER在子外壳中设置它。

相关内容