cat / dev / null到多个文件以清除日志等现有文件

时间:2015-06-17 15:09:41

标签: linux bash shell command-line tee

清除日志的好方法(syslog有一个文件句柄)已冻结我的linux服务器(空间不足)我试过cat /dev/null > fileABC; cat /dev/null/ > fileXYZ

如何通过cat / dev / null将多个文件清除为高效或单个命令中的多个文件。

3 个答案:

答案 0 :(得分:17)

硬编码解决方案

<强> tee

无回声,只需使用tee命令将其发送到多个文件即可。

像这样:

$ echo -n | tee file1 file2 file3 file4 file5

该列表中的所有文件都将为空,如果它们不存在则会创建。

应用于你的答案,这将是:

$ cat /dev/null | tee fileABC fileXYZ

虽然echo -n被认为是比cat /dev/null更好的做法,但更好的解决方案是使用printf '',如 Charles Duffy 所述。导致以下命令:

$ printf '' | tee file1 file2 file3 

<强> truncate

正如 skrilled 所回答,truncate可能是您最初寻找的解决方案。该命令允许提供任意多个文件名参数。您可以按如下方式轻松使用它:

$ truncate --size 0 file1 file2 file3 file4 file5

这使您可以在不使用任何管道的情况下实现目标,只需一个命令, skrilled 提供了非常好的答案。

结构文件名解决方案

如果所有文件的名称都有结构(例如个文件)和位置,则可以使用find命令。在下面的示例中,我将擦除应用于当前目录和当前目录中所有目录中的所有.java.c源文件。

$ find . -maxdepth 2 -type f -name '*.java' -exec truncate --size 0 "{}" \; 

说明:

  • find .在当前目录find
  • 中执行.
  • -maxdepth 2递归级别,下降到目录中的目录但不再进一步(级别2)。将此值设置为1表示不下降或n下降n次。
  • -type f仅适用于文件,而不适用于目录
  • -name '*.java'仅适用于以.java
  • 结尾的文件
  • -exec truncate --size 0 "{}" \;截断找到的每个文件(文件名存储在{}

有关更多选项和更详细的说明,请参阅man find。请务必查看,因为find是文件编辑自动化最强大的工具之一。

单独文件解决方案中的文件列表

最简单的方法可能是将文件存储在文件中,逐行删除。如果没有关于它们的位置和名称的明显结构,那就是。

假设文件存储在名为erasure的文件中。

$ cat erasure
fileABC
fileXYZ
dir/anotherFile

在这个例子中,我们将删除上面列出的三个文件。

$ while read file; do > "$file"; done < erasure

说明:

  • while read file对于给定文件中的每一行,将该行存储在变量file
  • do > "$file"清空文件并输出任何内容(即删除它)
  • done < erasure使用<(重定向)
  • 指定输入文件

注意:虽然此方法会保留路径中的空格,但它无法处理反斜杠和尾随空格,如 Charles Duffy 所述。解决这两个问题的一种方法是修改循环,如下所示:

while IFS= read -r file; do > "$file"; done < erasure

然而文件名中的换行仍然是个问题。解决此问题的唯一方法是使用空终止(\0)分隔文件名。现在正确的循环变为:

while IFS= read -r -d '' file; do > "$file"; done < erasure

答案 1 :(得分:4)

Truncate也可用于清空文件。

truncate --size 0 /path/to/file/here

答案 2 :(得分:0)

你可以很好地使用 GNU Parallel 这样做:

parallel '>' ::: TooLong.log BigBoy.dat NonExistant.file