0

我正在尝试将目录树中所有文件的时间戳增加一小时(以纠正 DST 更改)。经过大量的修补和搜索,我想出了如何使用 find、stat 和 touch 来完成它,但是当我将所有内容放在一个命令中时,它失败了。命令是:

find ~/dir -type f -exec touch -m --date="$(stat -c '%y' '{}') + 3600 sec" '{}' \;

或者使用 args:

find $DIRNAME -type f -print0 | xargs -0 touch -m --date="$(stat -c '%y' '{}') + 3600 sec"

但是它不起作用并返回错误: stat: cannot stat `{}': No such file or directory

我已经在这堵墙上撞了半天了。有什么建议吗?

4

6 回答 6

1

第二个示例中的错误消息是因为您没有使用xargs -I {}. 为了避免过早地评估事物,请将命令传递给sh单引号。

find $DIRNAME -type f -print0 | xargs -0 -I {} sh -c 'touch -m --date="$(stat -c '%y' "{}") + 3600 sec" "{}"'
于 2010-11-18T20:39:05.157 回答
1
find $DIRNAME -type f |
    while read file; do
        touch -m --date="$(stat -c '%y' "$file") + 3600 sec"
    done
于 2010-11-18T13:12:32.807 回答
0

这会做到的

find $DIRNAME -type f -exec bash -c 'touch -m --date="$(stat -c %y "$1") + 3600 sec" "$1"' -- {} \;

问题是 -exec 有时很难找到 {},如果你的 -exec 使用 + 而不是 \; 它只允许一次。在这种情况下,有时“最简单”的事情是调用 bash 并将每个结果传递给它,这就是我在上面所做的。

在这种情况下,所有这些真正实现的是避免其他解决方案的 read/while 循环,但在某些情况下,这是一项必不可少的技术。

于 2010-11-18T18:24:44.247 回答
0

我是原创海报。谢谢大家的提示和解释。只是为了澄清我为什么这样做。DST 更改影响了我用来在 windows、mac 和 linux 系统之间传输数据的 FAT 外部硬盘驱动器,因此搞砸了我的 rsync。我认为更改所有文件的时间比复制所有文件更容易和更快(也许不是,但那是另一个线程,我猜)

于 2010-11-21T15:37:15.547 回答
0

尝试这个:

find . -type f | while read line; do NEW_TS=`date -d@$((\`stat -c '%Y' $line\` + 3600 )) '+%Y%m%d%H%M.%S'`; touch -t $NEW_TS ${line}; done
于 2010-11-18T13:57:44.450 回答
0

非常感谢,克里斯!实际上最后应该有一个“$file”(带引号或者它会忽略带空格的文件名,不知道为什么),但除此之外它似乎有效。

find $DIRNAME -type f |
    while read file; do
        touch -m --date="$(stat -c '%y' "$file") + 3600 sec" "$file"
    done
于 2010-11-18T14:01:58.767 回答