如何在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是你可能找出哪些进程对空文件有句柄的一种方法。