在目录和子目录中查找所有零字节文件


80

如何在目录及其子目录中找到所有零字节文件?

我已经做到了:

#!/bin/bash
lns=`vdir -R *.* $dir| awk '{print $8"\t"$5}'`
temp=""
for file in $lns; do
    if test $file = "0"; then
        printf $temp"\t"$file"\n"
    fi
    temp=$file
done

但是,我只在当前目录中得到结果,而不是子目录,并且如果任何文件名包含空格,那么我只会得到第一个单词,后跟制表


您可能想阅读man find
2013年

问题也发布在unix&linux上-请不要在多个地方发布相同的问题。
格伦·杰克曼(Glenn Jackman)2013年

下次由于我在浏览器中在超级用户中发布的stackoverflow中的问题而导致我不再重复这样的操作,但是现在通过清除历史记录cookie和catche解决了该问题,因此我在这里再次提问
Civa

Answers:


171

要打印大小为$ dir的$ dir及其以下的所有文件的名称:

find "$dir" -size 0

请注意,并非所有的实现find都会默认产生输出,因此您可能需要执行以下操作:

find "$dir" -size 0 -print

关于问题的最后循环的两个评论:

不必遍历字符串中的每个其他单词并查看替代值是否为零,您可以通过遍历行来部分消除空白所带来的问题。例如:

printf '1 f1\n0 f 2\n10 f3\n' | while read size path; do
    test "$size" -eq 0 && echo "$path"; done

请注意,如果ls输出的任何路径包含换行符,这将在您的情况下失败,并且这将加强两点:不要解析ls,并且具有明智的命名策略,该策略不允许在路径中使用空格。

其次,要从循环中输出数据,无需将输出存储在变量中echo。如果仅让循环将其输出写入stdout,则可以完成相同的操作,但要避免存储它。


我可以过滤* .xml以外的目录

2
还有一个方便的-empty选择。
韦斯利·鲍尔

@WesleyBaugh带有-empty选项,您还会在其中包含零文件的目录
Igor Scabini

1
@IgorScabini如果要限制文件,可以使用-type f
Wesley Baugh

可爱!简单明了。伙计,我没有find足够地使用此命令。我真的必须克服我担心弄清楚它的恐惧。好有用
racl101

31

除了上述答案之外:

如果您想删除这些文件

find $dir -size 0 -type f -delete

1
不必一直删除所有大小为0的文件。
Raghvendra

然后如何删除大小为0的文件夹中的文件
Raghvendra

-exec /bin/rm {} \;-exec /bin/rm {} +也可以在find不支持非标准扩展的非GNU实现上使用-delete
Gert van den Berg,

8

不,您不必打扰grep。

find $dir -size 0 ! -name "*.xml"

3

经过Bash 4+测试-这是搜索大小0的正确方法:

find /path/to/dir -size 0 -type f -name "*.xml"

搜索大小为0的多个文件扩展名:

find /path/to/dir -size 0 -type f \( -iname \*.css -o -iname \*.js \)

注意:如果删除了\(... \),结果将是所有满足此要求的文件,因此忽略大小0。


-iname是不能移植到一些非GNU实现find这里的标准清单的选项
格特·范登贝尔赫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.