如何整理查找,统计和触摸?

时间:2010-11-18 12:37:03

标签: bash find touch stat

我正在尝试将目录树中所有文件的时间戳增加一小时(以纠正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:不能统计`{}':没有这样的文件或目录

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

6 个答案:

答案 0 :(得分:1)

find $DIRNAME -type f |
    while read file; do
        touch -m --date="$(stat -c '%y' "$file") + 3600 sec"
    done

答案 1 :(得分:1)

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

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

答案 2 :(得分: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

答案 3 :(得分:0)

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

find $DIRNAME -type f |
    while read file; do
        touch -m --date="$(stat -c '%y' "$file") + 3600 sec" "$file"
    done

答案 4 :(得分:0)

这样做

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

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

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

答案 5 :(得分:0)

我是原始海报。谢谢大家的提示和解释。 只是为了澄清我为什么要这样做。 DST更改影响了我用于在Windows,Mac和Linux系统之间传输数据的FAT外部硬盘,因此搞砸了我的rsync。我认为更改所有文件的atime比复制所有文件更容易,更快(也许不是,但我想这是另一个线程)