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



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

echo "" > catalina.out

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

我已经尝试过了

通常我会尝试涉及findxargs的东西,但如果重定向是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

相关内容

  • 没有找到相关文章

最新更新