这就是我想要实现的目标.
我有一个包含超过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)
这是做你想做的最简单,最强大的方法.
find
并xargs
可以使用以空终止的字符串进行通信,因此您可以
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)