catalina.out 但我想在单个命令(或命令管道)中对多个文件执行此操作。最优雅的方法是什么? 到目前为止我尝试了什么 通常我会-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:39:37 28 4
gpt4 key购买 nike

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

echo "" > catalina.out

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

到目前为止我尝试了什么

通常我会尝试一些涉及 findxargs 的东西,但是如果重定向是你的 xargs 命令的一部分,我不确定绑定(bind)优先级是否会以这种方式解释我打算。我试过了,但没有成功:

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,因为自文档化代码更易于阅读。

最佳答案

您可以使用截断命令:

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

但我认为这不太优雅。

关于bash - 在 *nix 命令行截断多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39355624/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com