我知道如何清空文件的内容而不删除它:
echo "" > catalina.out
但我想在单个命令(或命令管道)中对多个文件执行此操作。最优雅的方式是什么?
到目前为止我尝试过的
通常我会尝试涉及find
和xargs
的东西,但如果重定向是你的xargs命令的一部分,我不确定绑定优先级是否会按照我想要的方式解释。我尝试过这个并没有用:
find $TOMCAT_HOME/logs/ -type f | xargs --delimiter "\n" -n 1 -I% echo "" > %I;
如果可能的话,我更喜欢使用find + xargs而不是-exec或tee + process替换。 (对于那些关心的人,我的信念是-exec
绕过了管道的可扩展性。在这个例子中可能不是那么多,但是我可以弄清楚如何使用管道的更多角落情况,我对管道的理解越高级 - 我认为Doug McIlroy的思想学派未被充分利用。而且,字符串内部的命令会破坏编辑器的语法突出显示功能)
回答(以下为redneb的积分)
我发现find -print0 | xargs -0
成语繁琐,我更喜欢使用xargs --delimiter。所以这就是我已经确定的方式,这是对已接受的答案的一种变化:
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