猫/ dev / null到多个文件来清除现有的文件,如日志

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

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

硬编码解决方案

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

结构文件名解决方案

如果所有文件的名称(例如java文件)和位置都有结构,则可以使用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 

截断也可以用来清空文件。

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