Unix shell脚本:更新所有子目录和子文件的时间戳,包括带空格的子目录和子文件

时间:2010-09-15 14:33:33

标签: linux unix shell

这就是我想要实现的目标。

我有一个包含超过4200个子文件/子目录的目录,所有这些都需要设置为某个时间戳。

这是一个问题,因为它们中的许多都有空格和其他奇怪的字符。

我尝试过的第一件事:

touch $(find .)

由于空间不会起作用。它将更新所有无空间的文件和目录的时间戳,但那些没有空间的文件和目录的时间戳不会收到新的时间戳。此外,正如人们所预料的那样,它在根目录中创建与带空格的文件名元素相对应的文件。因此,如果我有一个名为“One Two Three”的文件,“touch”会在根目录中创建3个文件,“One”,“Two”和“Three”。这可以通过使用-c和'touch'来解决,但当然它仍然不会使用spacey名称更新文件。

我尝试的第二件事是:

for FILENAME in $(find .); do touch -t 201007162310.00 "$FILENAME"; done

但这是同一个故事。

我在网上找到了几个结果,但他们都试图以不同的方式实现某些目标,因此提出一些对我不起作用的方法。

所以现在我迷路了。有什么想法吗?

是否真的无法使'find'命令在前面添加并用引号或其他内容附加每一行?

编辑:这需要通过shell脚本完成。使用Perl,PHP或任何其他环境都无济于事。除了Unix shell脚本之外,我可以轻松地做到这一点,但它必须是在Unix shell脚本中,最好不是一个大脚本。

4 个答案:

答案 0 :(得分:11)

find . -exec touch -t 201007162310.00 {} +

这是做你想做的最简单,最健壮的方式。

答案 1 :(得分:5)

findxargs可以使用空终止字符串进行通信,因此您可以

find . -print0 | xargs -0 touch

这不会完全符合您的要求,因为会有许多touch的调用导致不同的时间。因此,您可以使用另一个文件作为参考时间戳

touch /tmp/ref
find. -print0 | xargs -0 touch -r /tmp/ref

答案 2 :(得分:1)

有两种选择:

  • 使用read,例如find . | while read x; do touch $x; done
  • 使用xargs,例如find . -print0 | xargs -0 touch

答案 3 :(得分:0)

如果你这样做

ls -b

-b将导致文件名打印出来,空格前面有转义字符'\'。

更新:我试过这个

find . | ls -b | xargs touch

它似乎适合我的小测试用例。