这就是我想要实现的目标。
我有一个包含超过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脚本中,最好不是一个大脚本。
答案 0 :(得分:11)
find . -exec touch -t 201007162310.00 {} +
这是做你想做的最简单,最健壮的方式。
答案 1 :(得分:5)
find
和xargs
可以使用空终止字符串进行通信,因此您可以
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
它似乎适合我的小测试用例。