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

Tee*_*kin 2 unix linux shell

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

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

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

我试过的第一件事:

touch $(find .)
Run Code Online (Sandbox Code Playgroud)

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

我尝试的第二件事是:

for FILENAME in $(find .); do touch -t 201007162310.00 "$FILENAME"; done
Run Code Online (Sandbox Code Playgroud)

但这是同一个故事.

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

所以现在我迷路了.有任何想法吗?

是否真的不可能使'find'命令前置并在每行附加引号或其他内容?

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

Rom*_*aka 11

find . -exec touch -t 201007162310.00 {} +
Run Code Online (Sandbox Code Playgroud)

这是做你想做的最简单,最强大的方法.


Bea*_*ano 5

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

find . -print0 | xargs -0 touch
Run Code Online (Sandbox Code Playgroud)

这不会完全满足您的要求,因为会多次调用touch不同的时间。因此,您可以使用另一个文件作为参考时间戳

touch /tmp/ref
find. -print0 | xargs -0 touch -r /tmp/ref
Run Code Online (Sandbox Code Playgroud)