One-Liner命令用于清空终端中的多个文本文件

时间:2011-12-31 01:10:35

标签: bash shell

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

我的想法是你可以沿着这些方向使用......:

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 {} \;

但是,如果不以类似的方式创建自己的脚本,是否可以这样做?

4 个答案:

答案 0 :(得分:10)

#!/bin/bash

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

或单线版

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

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

Bash 4.X

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

Posix的

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

答案 1 :(得分:4)

您还可以使用: >(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
$ 

答案 2 :(得分:3)

或使用sed

sed Q -i *

用空虚替换文件内容。

更新说明

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

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

用“替换任何东西直到:用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
$ 

答案 3 :(得分:0)