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

问题描述 投票:1回答:2

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

echo "" > catalina.out

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

到目前为止我尝试过的

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

bash truncate xargs
2个回答
6
投票

您可以使用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

但我觉得这不太优雅。


0
投票

在macOS上,默认情况下没有truncate命令,你可以使用聪明的重定向和tee作为替代。

find $TOMCAT_HOME/logs/ -type f -exec tee {} + < /dev/null
© www.soinside.com 2019 - 2024. All rights reserved.