我知道如何清空文件的内容而不删除它:
echo "" > catalina.out
,但我想在一个命令(或命令管道)中对多个文件执行此操作。最优雅的方式是什么?
我已经尝试过了
通常我会尝试涉及find
和xargs
的东西,但如果重定向是xargs命令的一部分,我不确定绑定优先级是否会按照我想要的方式解释。我试过这个,它没有工作:
find $TOMCAT_HOME/logs/ -type f | xargs --delimiter "n" -n 1 -I% echo "" > %I;
如果可能的话,我更喜欢使用find + xargs而不是find -exec或tee +进程替换。(对于那些关心的人,我认为-exec
绕过了管道的可扩展性。也许在这个例子中没有那么多,但我能弄清楚如何使用管道的角落案例越多,我对管道的理解就越先进——我认为Doug McIlroy的思想流派没有得到充分利用。此外,字符串中的命令会破坏编辑器的语法高亮功能)
答案(感谢下面的redneb)
我发现find -print0 | xargs -0
习惯用法很麻烦,我更喜欢使用xargs——分隔符。因此,以下是我确定的方法,这是公认答案的变体:
find $TOMCAT_HOME/logs/ -type f | xargs --delimiter "n" truncate --size=0
我也使用截断的长选项--size
,因为自文档代码更易于人类阅读。
您可以使用truncate
命令:
find $TOMCAT_HOME/logs/ -type f -exec truncate -s0 {} +
truncate -s0
将一个文件截断为0字节。Truncate的优点是可以在多个文件上调用。
如果你喜欢使用xargs
,你可以这样做:
find $TOMCAT_HOME/logs/ -type f -print0 | xargs -0 truncate -s0
在macOS上,默认没有truncate
命令,您可以使用智能重定向和tee
作为替代。
find $TOMCAT_HOME/logs/ -type f -exec tee {} + < /dev/null