我知道如何清空文件的内容而不删除它:
echo "" > catalina.out
但我想在单个命令(或命令管道)中对多个文件执行此操作。最优雅的方式是什么?
到目前为止我尝试了什么
通常我会尝试涉及find
和xargs
的内容,但如果重定向是xargs命令的一部分,我不确定绑定优先级是否会按照我的意图解释。我尝试了这个并没有用:
find $TOMCAT_HOME/logs/ -type f | xargs --delimiter "\n" -n 1 -I% echo "" > %I;
我更愿意使用find + xargs而不是在可能的情况下找到-exec或tee +进程替换。 (对于那些关心的人,我的信念是-exec
绕过了管道的可扩展性。在这个例子中可能不是那么多,但是我可以弄清楚如何使用管道的更多角落情况,我对管道将是 - 我认为Doug McIlroy的思想学派未得到充分利用。此外,字符串内部的命令会破坏编辑器的语法高亮功能)
回答(以下信息为redneb)
我发现find -print0 | xargs -0
成语很麻烦,我更喜欢使用xargs --delimiter。所以这就是我已经确定的方式,这是对已接受的答案的一种变化:
find $TOMCAT_HOME/logs/ -type f | xargs --delimiter "\n" truncate --size=0
我也使用截断的长选项--size
,因为自我记录代码更易于阅读。
答案 0 :(得分:5)
您可以使用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
但我认为这不太优雅。
答案 1 :(得分:0)
在默认情况下没有truncate
命令的macOS上,您可以使用巧妙的重定向和tee
作为替代。
find $TOMCAT_HOME/logs/ -type f -exec tee {} + < /dev/null