75

我有一个目录,其中包含许多 0 字节文件。当我使用 ls 命令时,我什至看不到文件。我正在使用一个小脚本来删除这些文件,但有时甚至不会删除这些文件。这是脚本:

i=100
while [ $i -le 999 ];do
    rm -f file${i}*;
    let i++;
done

有没有其他方法可以更快地做到这一点?

4

10 回答 10

139

find结合使用xargs

find . -name 'file*' -size 0 -print0 | xargs -0 rm

您避免rm为每个文件启动。

于 2010-07-01T11:49:42.247 回答
92

使用 GNU find(见注释),不需要使用 xargs :

find -name 'file*' -size 0 -delete
于 2010-07-01T12:52:42.767 回答
10

如果要查找并删除文件夹中的所有 0 字节文件:

find /path/to/folder -size 0 -delete
于 2018-12-26T16:27:39.843 回答
6

您可以使用以下命令:

寻找 。-maxdepth 1 -size 0c -exec rm {} \;

如果还想删除子目录中的 0 字节文件,请-maxdepth 1在前面的命令中省略并执行。

于 2010-07-01T11:58:10.073 回答
6
find . -maxdepth 1 -type f -size 0 -delete

这会在当前目录中找到大小为 0 的文件,而不进入子目录,并将它们删除。

要列出文件而不删除它们:

find . -maxdepth 1 -type f -size 0
于 2018-01-12T09:01:18.540 回答
4

删除当前目录下所有名为 file... 的文件:

find . -name file* -maxdepth 1 -exec rm {} \;

这仍然需要很长时间,因为它对rm每个文件都开始。

于 2010-07-01T11:46:53.113 回答
2

您甚至可以使用选项 -delete 来删除文件。

从 man find, -delete 删除文件;如果删除成功,则为 true。

于 2010-07-01T16:32:30.410 回答
1

这是一个示例,您自己尝试将有助于理解:

bash-2.05b$ touch empty1 empty2 empty3
bash-2.05b$ cat > fileWithData1
Data Here
bash-2.05b$ ls -l
total 0
-rw-rw-r--    1 user group           0 Jul  1 12:51 empty1
-rw-rw-r--    1 user group           0 Jul  1 12:51 empty2
-rw-rw-r--    1 user group           0 Jul  1 12:51 empty3
-rw-rw-r--    1 user group          10 Jul  1 12:51 fileWithData1
bash-2.05b$ find . -size 0 -exec rm {} \;
bash-2.05b$ ls -l
total 0
-rw-rw-r--    1 user group          10 Jul  1 12:51 fileWithData1

如果您查看 find (type man find) 的手册页,您将看到该命令的一系列强大选项。

于 2010-07-01T11:54:57.897 回答
0

“......有时甚至不删除这些文件”让我觉得这可能是你经常做的事情。如果是这样,此 Perl 脚本将删除当前目录中的所有零字节常规文件。它通过使用系统调用(取消链接)完全避免了 rm,而且速度非常快。

#!/usr/bin/env perl
use warnings;
use strict;

my @files = glob "* .*";
for (@files) {
    next unless -e and -f;
    unlink if -z;
}
于 2010-07-01T12:58:10.847 回答
0

提高一个级别,找出文件存在的原因是值得的。您只是通过删除症状来治疗症状。如果某些程序正在使用它们来锁定资源怎么办?如果是这样,您删除它们可能会导致腐败。

lsof 是您可以找出哪些进程对空文件有句柄的一种方法。

于 2010-07-01T13:22:05.490 回答