我正在查看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
:打印给定字符串三个月后的日期(在本例中,该字符串是命令stat
on的输出$f
)。
总之,上面将找到当前文件夹(包括所有子目录)中每个文件或目录的修改日期,并将其日期设置为现在的三个月后。
答案2
从问题的描述来看,我相信您正在寻找一个可以获取上次文件修改时间然后添加 3 个月的工具。你可以用stat
+ touch
+ 一些 shell 算术评估来做到这一点。例如,要在file
时间戳上添加 90 天,您可以编写
touch -d "@$(( $(stat -c '%Y' file) + 90*24*3600 ))" file
然后循环遍历file
您需要的所有内容。
答案3
我会使用-exec
find - 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
在子外壳中设置它。