在 *nix 命令行截断多个文件
Truncate multiple files at *nix command line
我知道如何在不删除文件的情况下清空文件内容:
echo "" > catalina.out
但我想在单个命令(或命令管道)中对多个文件执行此操作。最优雅的方法是什么?
到目前为止我尝试了什么
通常我会尝试一些涉及 find
和 xargs
的东西,但是如果重定向是你的 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
我知道如何在不删除文件的情况下清空文件内容:
echo "" > catalina.out
但我想在单个命令(或命令管道)中对多个文件执行此操作。最优雅的方法是什么?
到目前为止我尝试了什么
通常我会尝试一些涉及 find
和 xargs
的东西,但是如果重定向是你的 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