如何删除多个0字节的文件在 linux?

我有一个目录,里面有许多0字节的文件。当我使用 ls 命令时,我甚至看不到文件。我使用一个小脚本删除这些文件,但有时甚至不删除这些文件。剧本如下:

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

还有别的办法能更快吗?

69000 次浏览

删除所有名为 file 的文件... 工作目录:

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

这仍然需要很长时间,因为它对每个文件启动 rm

结合使用 findxargs

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

您可以避免为每个文件启动 rm

这里有一个例子,你自己尝试一下会有助于理解:

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 的手册页(类型为 man find) ,您将看到该命令的一组强大选项。

您可以使用以下命令:

- maxdeep 1-size 0c-exec rm {} ;

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

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

find -name 'file*' -size 0 -delete

“ ... ... 有时甚至不删除这些文件” 让我觉得这可能是你经常做的事情。如果是这样,这个 Perl 脚本将删除工作目录中任何零字节的常规文件。它通过使用一个系统调用(unlink)完全避免了 rm,而且非常快。

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


my @files = glob "* .*";
for (@files) {
next unless -e and -f;
unlink if -z;
}

更上一层楼是值得去弄清楚为什么文件会在那里。你只是通过删除它们来治疗症状。如果某个程序使用它们来锁定资源怎么办?如果是这样,你删除它们可能会导致腐败。

Lsofs 是您可以确定哪些进程拥有空文件句柄的一种方法。

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

从男人发现, 删除 删除文件; 如果删除成功,则为 true。

find . -maxdepth 1 -type f -size 0 -delete

这会找到工作目录中大小为0的文件,而不会进入子目录,然后删除它们。

列出文件而不删除它们:

find . -maxdepth 1 -type f -size 0

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

find /path/to/folder -size 0 -delete