【问题标题】:One-Liner command to empty multiple text files in terminal用于在终端中清空多个文本文件的 One-Liner 命令
【发布时间】:2011-12-31 01:10:34
【问题描述】:

您将如何使用单个命令来清空终端中的多个文本文件?

我的想法是你可以使用这些方面的东西......:

find /var/log/apache2/*log -exec `echo > '{}'` \;

我知道创建一个可以轻松做到这一点的 shell 脚本很简单:

echo "#!/bin/sh\n\necho \"\" > \"$1\"" > /usr/local/bin/empty && chmod +x /usr/local/bin/empty

...

find /var/log/apache2/*.log -exec empty {} \;

但是是否可以在不以类似方式创建自己的脚本的情况下做到这一点?

【问题讨论】:

    标签: bash shell


    【解决方案1】:
    #!/bin/bash
    
    for file in /var/log/apache2/*.log; do
      : > "$file"
    done
    

    或者单行版本

    for file in /var/log/apache2/*.log; do : > "$file"; done
    

    如果你需要递归到子目录,那么你可以使用以下两个选项:

    重击 4.X

    shopt -s globstar; for file in /var/log/apache2/**.log; do : > "$file"; done
    

    正则

    find /var/log/apache2 -type f -name "*.log" -exec sh -c 'for f; do : > "$f"; done' _ {} +
    

    【讨论】:

    • 嗨,我很欣赏这个答案,但我正在寻找一个 oneliner 命令。 (见标题)谢谢! :)
    • @HighwayofLife 我放了它的 1-liner 版本。我还添加了另一种方法来使用find
    【解决方案2】:

    或者使用sed:

    sed Q -i *
    

    用空虚替换文件内容。

    更新说明

    sed 可以做各种替换,例如使用正则表达式:

    $ cat /etc/passwd | sed -e s/^[^:]*/USER/
    

    使用“替换任何内容,直到 : with USER”的模式,给出:

    USER:x:0:0:root:/root:/bin/bash
    USER:x:1:1:daemon:/usr/sbin:/bin/sh
    USER:x:2:2:bin:/bin:/bin/sh
    etc etc
    

    在混合中添加-ised 可以就地编辑文件,所以你可能永远不想这样做:

    $ sed -e s/^[^:]*/USER/ -i /etc/passwd
    

    (请注意,在例如 Mac OS X 上,您需要在 -i 之后添加一个额外参数以提供“备份后缀”,用于在 sed 对您的文件发挥作用之前进行备份)

    现在的任务是让最短的sed 脚本丢失所有输入,即dQd 将删除所有输入(然后不输出任何内容),Q 将立即退出(并且不输出任何内容)。 Q 大概是最快的。

    然后,sarnold 示例将如下所示:

    $ ls -l
    -rw-r--r-- 1 sarnold sarnold  10161 2011-12-30 17:47 alternatives.log
    -rw-r----- 1 sarnold sarnold  50976 2011-12-30 17:47 auth.log
    -rw-r--r-- 1 sarnold sarnold    759 2011-12-30 17:47 boot.log
    $ sed Q -i *.log
    $ ls -l
    -rw-r--r-- 1 sarnold sarnold 0 2011-12-30 17:47 alternatives.log
    -rw-r----- 1 sarnold sarnold 0 2011-12-30 17:47 auth.log
    -rw-r--r-- 1 sarnold sarnold 0 2011-12-30 17:47 boot.log
    $ 
    

    【讨论】:

    • 您好,感谢您的回答。但是,它非常模糊。 +1,如果您可以提供工作示例和解释。 :)
    • 这非常聪明; d 是整个 sed(1) 脚本,上面写着“删除”。 -i 要求sed(1)“就地”执行编辑,而不备份文件。 sed d -i *.log 更适合您的问题。
    • 完全同意。 mvds,如果您可以编辑答案以反映@sarnold 提供的描述和示例,我会选择您的答案。谢谢!
    • 完成,但我必须说我不会在实践中使用它。这很有趣(就像tee 方法),但一年后你或其他任何人都会完全错过正在发生的事情。
    【解决方案3】:

    您还可以使用: >(tee *.log) 生成tee(1) 程序来执行截断:

    $ ls -l
    total 1284
    -rw-r--r-- 1 sarnold sarnold  10161 2011-12-30 17:47 alternatives.log
    -rw-r----- 1 sarnold sarnold  50976 2011-12-30 17:47 auth.log
    -rw-r--r-- 1 sarnold sarnold    759 2011-12-30 17:47 boot.log
    -rw-r--r-- 1 sarnold sarnold  41377 2011-12-30 17:47 bootstrap.log
    -rw-r----- 1 sarnold sarnold      0 2011-12-30 17:47 daemon.log
    -rw-r--r-- 1 sarnold sarnold  73075 2011-12-30 17:47 dpkg.log
    -rw-r--r-- 1 sarnold sarnold   2914 2011-12-30 17:47 fontconfig.log
    -rw-r----- 1 sarnold sarnold 152295 2011-12-30 17:47 kern.log
    -rw-r----- 1 sarnold sarnold      0 2011-12-30 17:47 lpr.log
    -rw-r----- 1 sarnold sarnold    950 2011-12-30 17:47 mail.log
    -rw-r--r-- 1 sarnold sarnold 212115 2011-12-30 17:47 pm-powersave.log
    -rw-r--r-- 1 sarnold sarnold 413195 2011-12-30 17:47 pm-suspend.log
    -rw-r--r-- 1 sarnold sarnold      0 2011-12-30 17:47 pycentral.log
    -rw-r----- 1 sarnold sarnold      0 2011-12-30 17:47 ufw.log
    -rw-r----- 1 sarnold sarnold      0 2011-12-30 17:47 user.log
    -rw-r--r-- 1 sarnold sarnold 210426 2011-12-30 17:47 Xorg.0.log
    -rw-r--r-- 1 sarnold sarnold  93985 2011-12-30 17:47 Xorg.1.log
    $ : >(tee *.log)
    $ ls -l
    total 0
    -rw-r--r-- 1 sarnold sarnold 0 2011-12-30 17:47 alternatives.log
    -rw-r----- 1 sarnold sarnold 0 2011-12-30 17:47 auth.log
    -rw-r--r-- 1 sarnold sarnold 0 2011-12-30 17:47 boot.log
    -rw-r--r-- 1 sarnold sarnold 0 2011-12-30 17:47 bootstrap.log
    -rw-r----- 1 sarnold sarnold 0 2011-12-30 17:47 daemon.log
    -rw-r--r-- 1 sarnold sarnold 0 2011-12-30 17:47 dpkg.log
    -rw-r--r-- 1 sarnold sarnold 0 2011-12-30 17:47 fontconfig.log
    -rw-r----- 1 sarnold sarnold 0 2011-12-30 17:47 kern.log
    -rw-r----- 1 sarnold sarnold 0 2011-12-30 17:47 lpr.log
    -rw-r----- 1 sarnold sarnold 0 2011-12-30 17:47 mail.log
    -rw-r--r-- 1 sarnold sarnold 0 2011-12-30 17:47 pm-powersave.log
    -rw-r--r-- 1 sarnold sarnold 0 2011-12-30 17:47 pm-suspend.log
    -rw-r--r-- 1 sarnold sarnold 0 2011-12-30 17:47 pycentral.log
    -rw-r----- 1 sarnold sarnold 0 2011-12-30 17:47 ufw.log
    -rw-r----- 1 sarnold sarnold 0 2011-12-30 17:47 user.log
    -rw-r--r-- 1 sarnold sarnold 0 2011-12-30 17:47 Xorg.0.log
    -rw-r--r-- 1 sarnold sarnold 0 2011-12-30 17:47 Xorg.1.log
    $ 
    

    【讨论】:

    • 我喜欢这种方法,而不是第一个带有 for 循环的方法。如果您通过创建 .log 文件并使用 : >(tee *.log) 使问题更具体,我会给 +1,这样他就不必为每个文件命名。虽然你仍然需要使用 find 或 globstar 如果你想递归超过当前目录
    • @SiegeX:很好的建议,它极大地改进了我的示例。谢谢!
    【解决方案4】:

    【讨论】:

    • 为了将来造福人民,介意发个例子吗?
    • @Highway:链接的另一端有一个。
    • 来吧,Ignacio,你知道我们不喜欢只是链接到其他答案的答案...
    • @IgnacioVazquez-Abrams 这并不是回答这个问题的一个例子。
    猜你喜欢
    • 1970-01-01
    • 2014-03-19
    • 2017-06-16
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 2015-02-04
    • 2021-08-16
    相关资源
    最近更新 更多