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

回答 4 浏览 16.5万 2013-03-29

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

我这样做了:

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

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

Civa 提问于2013-03-29
您可能想阅读man findalk 2013-03-29
问题也发布在 unix&linux - 请不要在多个地方发布相同的问题。glenn jackman 2013-03-29
下次我不会像这样重复,因为我在超级用户中发布了我在 stackoverflow 中的浏览器问题,但现在通过清除历史 cookie 和 ie 中的缓存解决了这个问题,所以我在这里再次询问Civa 2013-03-29
4 个回答
#1楼 已采纳
得票数 230

打印大小为 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输出的任何路径都包含新行,这在你的案例中就会失败,这加强了两点:不要解析ls,要有一个合理的命名策略,不允许在路径中使用空格。

第二,要从循环中输出数据,没有必要为了echo而将输出存储在一个变量中。如果你简单地让循环把它的输出写到stdout,你就达到了同样的目的,但避免了存储它。

William Pursell 提问于2013-03-29
William Pursell 修改于2020-01-09
我可以过滤 *.xml 以外的目录吗Civa 2013-03-29
还有一个方便的-empty 选项。Wesley Baugh 2017-07-26
@WesleyBaugh 使用 -empty 选项,您还可以获得内部文件为零的目录Igor Scabini 2017-09-20
@IgorScabini 如果你想限制文件,你可以使用-type f 来实现。Wesley Baugh 2017-09-20
#2楼
得票数 48

作为对上述答案的补充,:

如果你想删除这些文件

find $dir -size 0 -type f -delete
LinuxLuigi 提问于2016-03-10
它没有必要一直删除所有大小为0的文件。Raghvendra 2017-01-16
那么,如何删除一个文件夹中大小为0的文件呢?Raghvendra 2017-01-16
-exec /bin/rm {} \;-exec /bin/rm {} +在非GNU的find实现上也可以工作,它不支持非标准的扩展-deleteGert van den Berg 2018-05-15
替代find $dir -size 0 -type f -delete的方法:find $dir -empty -type f -deleteAxelS 2022-12-20
#3楼
得票数 9

不,你不需要麻烦grep了。

find $dir -size 0 ! -name "*.xml"
Batcher 提问于2013-03-30
#4楼
得票数 5

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的文件。

Mike Q 提问于2016-09-28
Mike Q 修改于2019-06-06
-iname不能移植到一些非GNU的find实现中,参见这里的标准选项列表。Gert van den Berg 2018-05-15
标签