清除日志(syslog 在文件上有一个句柄)的好方法,这些日志冻结了我的 Linux 服务器(空间不足),我尝试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 ''
,正如查尔斯·达菲所指出的。生成以下命令:
$ 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
然而,文件名中的换行符仍然是一个问题。解决此问题的唯一方法是使用空终止 (