cat /dev/null 到多个文件以清除日志等现有文件
cat /dev/null to multiple files to clear existing files like logs
清除日志(syslog 有文件句柄)的好方法冻结了我的 linux 服务器(超出 space)我试过 cat /dev/null > fileABC; cat /dev/null/ > fileXYZ
如何通过 cat /dev/null 以高效或单个命令将多个文件清除到多个文件。
Truncate 也可用于清空文件。
truncate --size 0 /path/to/file/here
硬编码解决方案
tee
什么都不回显,只需使用 tee
命令将其发送到多个文件即可。
像这样:
$ echo -n | tee file1 file2 file3 file4 file5
该列表中的所有文件都将为空,如果不存在则创建。
应用于您的答案将是:
$ cat /dev/null | tee fileABC fileXYZ
虽然 echo -n
被认为比 cat /dev/null
更好,但更好的解决方案是使用 printf ''
,正如 Charles Duffy[=112= 所指出的那样].导致以下命令:
$ 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
使用 <
(重定向)指定输入文件
注意:虽然此方法在路径中保留 spaces,但它无法处理反斜杠和尾随白色 space,如 Charles Duffy 所述.解决这两个问题的一种方法是按如下方式修改循环:
while IFS= read -r file; do > "$file"; done < erasure
但是文件名中的换行符仍然是个问题。解决此问题的唯一方法是使用空终止符 ([=47=]
) 分隔文件名。正确的循环现在变成:
while IFS= read -r -d '' file; do > "$file"; done < erasure
你可以像这样用 GNU Parallel 很好地做到这一点:
parallel '>' ::: TooLong.log BigBoy.dat NonExistant.file
清除日志(syslog 有文件句柄)的好方法冻结了我的 linux 服务器(超出 space)我试过 cat /dev/null > fileABC; cat /dev/null/ > fileXYZ
如何通过 cat /dev/null 以高效或单个命令将多个文件清除到多个文件。
Truncate 也可用于清空文件。
truncate --size 0 /path/to/file/here
硬编码解决方案
tee
什么都不回显,只需使用 tee
命令将其发送到多个文件即可。
像这样:
$ echo -n | tee file1 file2 file3 file4 file5
该列表中的所有文件都将为空,如果不存在则创建。
应用于您的答案将是:
$ cat /dev/null | tee fileABC fileXYZ
虽然 echo -n
被认为比 cat /dev/null
更好,但更好的解决方案是使用 printf ''
,正如 Charles Duffy[=112= 所指出的那样].导致以下命令:
$ 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 .
在当前目录.
执行-maxdepth 2
递归级别,下降到目录中的目录,但不再下降(级别 2)。将其设置为 1 不下降或n
下降n
次。-type f
只适用于文件,不适用于目录-name '*.java'
仅适用于以.java
结尾的文件
-exec truncate --size 0 "{}" \;
截断找到的每个文件(文件名存储在{}
)
find
有关更多选项和更详细的说明,请参阅 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
使用<
(重定向)指定输入文件
注意:虽然此方法在路径中保留 spaces,但它无法处理反斜杠和尾随白色 space,如 Charles Duffy 所述.解决这两个问题的一种方法是按如下方式修改循环:
while IFS= read -r file; do > "$file"; done < erasure
但是文件名中的换行符仍然是个问题。解决此问题的唯一方法是使用空终止符 ([=47=]
) 分隔文件名。正确的循环现在变成:
while IFS= read -r -d '' file; do > "$file"; done < erasure
你可以像这样用 GNU Parallel 很好地做到这一点:
parallel '>' ::: TooLong.log BigBoy.dat NonExistant.file