101

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

我已经这样做了:

#!/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

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

4

4 回答 4

203

要打印大小为 0 的 $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 输出的任何路径包含换行符,这将在您的情况下失败,这强化了 2 点:不要 parse ls,并且有一个不允许路径中有空格的合理命名策略。

其次,要从循环中输出数据,不需要将输出存储在变量中echo。如果您只是让循环将其输出写入标准输出,您可以完成同样的事情,但要避免存储它。

于 2013-03-29T12:58:35.623 回答
37

除了上面的答案:

如果您想删除这些文件

find $dir -size 0 -type f -delete
于 2016-03-10T08:25:58.830 回答
9

不,您不必打扰 grep。

find $dir -size 0 ! -name "*.xml"
于 2013-03-30T15:29:37.763 回答
4

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。

于 2016-09-28T19:59:49.917 回答