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

Truncate multiple files at *nix command line

我知道如何在不删除文件的情况下清空文件内容:

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 --delimiter。所以这是我确定的方式,它是已接受答案的变体:

find $TOMCAT_HOME/logs/ -type f | xargs --delimiter "\n" truncate --size=0

我还使用了 truncate 的长选项 --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

但我觉得这样不太优雅。

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

find $TOMCAT_HOME/logs/ -type f -exec tee {} + < /dev/null