我有一个文件夹里面有很多大小为0的文件。当我使用ls命令时,甚至看不到这些文件。我正在使用一个小脚本来删除这些文件,但有时候它甚至不能删除这些文件。以下是脚本:
i=100
while [ $i -le 999 ];do
rm -f file${i}*;
let i++;
done
有没有其他更快的方法可以做到这一点?
我有一个文件夹里面有很多大小为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
。xargs
我给出加一分的评价,它比 -exec
更好用。考虑使用 -print0
和 -0
以提高安全性。 - Martin Wickman-exec
选项会为每个参数开始一个新的进程,而xargs
则不会。这是在启动进程数量方面的重大改进,并且有助于提高执行时间。请参阅man xargs
以获取更多信息。 - Didier Trosset-size 0c
更准确(未指定单位默认为块数),但你错误地表示-size 0
将包括小于512字节的文件。实际上,只要文件大小达到1字节,它就会占用1个块。 - Didier Trossetfind . -type f -name '*' -size 0 -print0 | xargs -r0 rm
。 - seanbreeden使用GNU的find
(请参阅评论),无需使用xargs:
find -name 'file*' -size 0 -delete
find . -size 0 -delete
。 - Colin Dfind
命令时,第一个参数应该是一个目录,例如 find /home/user/ -name "file* ..."
. 强烈建议:首先使用 -print
参数而非 -delete
参数,当确认结果符合要求后再删除文件。 - coredump如果您想查找并删除文件夹中的所有0字节文件:
find /path/to/folder -size 0 -delete
find . -maxdepth 1 -type f -size 0 -delete
这个命令可以在当前目录下查找大小为0的文件,而不会进入子目录,并将它们删除。
要列出文件但不删除它们:
find . -maxdepth 1 -type f -size 0
您可以使用以下命令:
find . -maxdepth 1 -size 0c -exec rm {} \;
如果您希望删除子目录中的0字节文件,请省略前一个命令中的-maxdepth 1
并执行。
删除当前目录中所有名为file...的文件:
find . -name file* -maxdepth 1 -exec rm {} \;
这将仍然需要很长时间,因为它会为每个文件启动rm
。
rm
命令只能删除大小为0的文件。公平地说,OP发布的代码也没有这样做。 - Nathan Fellman+
代替;
,这样find
命令就能够一次性传递多个文件给rm
,而不是每个文件都单独调用一次rm
进程。 - Philipp你甚至可以使用选项-delete来删除文件。
来自于find的man文档, -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;
}
这里有一个例子,自己尝试一下会更容易理解:
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
man find
命令的手册页面,就会发现这个命令有许多强大的选项。提升一下层次,值得弄清楚这些文件为什么存在。仅仅通过删除它们来处理症状是不够的。如果某个程序正在使用它们来锁定资源,那么你的删除可能会导致损坏。
lsof 是一种可以找出哪些进程控制着空文件的方法之一。
while [ $i -le 999]
和let i++
,你也可以使用seq
结合for i in $(seq ...)
。 - YuppieNetworking