在* nix命令行截断多个文件

时间:2016-09-06 18:30:13

标签: bash truncate xargs

我知道如何清空文件的内容而不删除它:

echo "" > catalina.out

但我想在单个命令(或命令管道)中对多个文件执行此操作。最优雅的方式是什么?

到目前为止我尝试了什么

通常我会尝试涉及findxargs的内容,但如果重定向是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,因为自我记录代码更易于阅读。

2 个答案:

答案 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