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

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

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

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

使用find结合xargs

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

你避免为每个文件启动rm

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

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

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

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

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

您可以使用以下命令:

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

如果要删除子目录中的0字节文件,则省略前一命令中的-maxdepth 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的man page( man find ),你会看到这个命令的一个强大的选项数组。

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

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

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

 #!/usr/bin/env perl use warnings; use strict; my @files = glob "* .*"; for (@files) { next unless -e and -f; unlink if -z; } 

上升到一个水平,这是值得弄清楚为什么这些文件在那里。 你只是通过删除它们来治疗症状。 如果某个程序正在使用它们来locking资源呢? 如果是这样,你删除它们可能导致腐败。

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