【问题标题】:Find all zero-byte files in directory and subdirectories查找目录和子目录中的所有零字节文件
【发布时间】:2013-03-20 04:18:14
【问题描述】:

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

我已经这样做了:

#!/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
  • 问题也发布在unix&linux - 请不要在多个地方发布相同的问题。
  • 下次我不会像这样重复,因为我在超级用户中发布了 stackoverflow 中的浏览器问题,但现在通过清除历史 cookie 并捕获问题解决了问题,所以我在这里再次询问

标签: linux shell


【解决方案1】:

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

find "$dir" -size 0

请注意,并非所有find 的实现都会默认产生输出,因此您可能需要这样做:

find "$dir" -size 0 -print

问题中最后一个循环的两个 cmets:

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

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

请注意,如果 ls 输出的任何路径包含换行符,这将在您的情况下失败,这强化了 2 点:不要解析 ls,并且有一个不允许路径中有空格的合理命名策略.

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

【讨论】:

  • 我可以过滤*.xml以外的目录
  • 还有一个方便的-empty 选项。
  • @WesleyBaugh 使用 -empty 选项,您还可以获得内部包含零文件的目录
  • @IgorScabini 如果你想限制文件,你可以使用-type f
  • 可爱!简单明了。伙计,我用这个find 命令不够用。我真的必须克服我对弄清楚它的恐惧。太有用了。
【解决方案2】:

不,你不必费心 grep。

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

【讨论】:

    【解决方案3】:

    作为上述答案的补充:

    如果您想删除这些文件

    find $dir -size 0 -type f -delete
    

    【讨论】:

    • 大小为0的文件不必一直删除。
    • 那么如何删除大小为0的文件夹中的文件
    • -exec /bin/rm {} \;-exec /bin/rm {} + 也适用于非 GNU find 实现,不支持非标准扩展 -delete
    【解决方案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。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    相关资源
    最近更新 更多