【问题标题】:Truncate multiple files at *nix command line在 *nix 命令行截断多个文件
【发布时间】:2019-02-15 12:52:26
【问题描述】:

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

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 绕过了管道的可扩展性。在这个例子中可能没有那么多,但我能弄清楚如何使用管道的角落案例越多,我对管道的理解就越深入be - 我认为 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


    【解决方案1】:

    您可以使用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 是一个命令。谢谢 :) (我会尽快标记正确的网站让我来!)
    • 这是一个很好的例子,说明为什么支持标准输入的程序更符合 Unix 风格并利用它们的力量(就像 truncate 一样)。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-07-21
      • 2018-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 2010-10-23
      • 2015-01-25
      • 2016-05-17
      相关资源
      最近更新 更多