列出文件大小都在一个范围内的目录

时间:2015-11-28 10:31:22

标签: linux bash

我想列出文件大小都在一个范围内的目录。我的解决方案是查看每个目录,如果它的所有文件大小在范围内,则显示出来。我想知道是否存在一种更简单的方法来检查像find命令中的切换或任何其他类似的命令。

例如:范围= 10 - 20

dir1:
f1 size=12
f2 size= 19

dir2:
f3 size=22
f4 size=11

OUTPUT = dir1

dir2被排除,因为f3超出10-20范围。不排除dir1,因为其所有文件的大小都在该范围内。

2 个答案:

答案 0 :(得分:2)

借用4ae1e1评论中的代码:

在每个命令行指定的子目录中查找规则的第一个例外(如果有)。如果允许,请打印。

dir_filesize_rangefilter() {
    # args: lo hi  paths...
    # sizes in MiB
    # return value: dir names printed to stdout
    local lo=$1 hi=$2
    shift 2  # "$@" is now just the paths

    for dir; do   # in "$@"   is implicit
        local safedir=$dir
        [[ $dir = /* ]] || safedir=./$dir   # make sure find doesn't treat weird -filenames as -options
        # find the first file smaller than lo or larger than hi
        [[ -z "$(find "$safedir" -type f 
               \( -size "-${lo}M" -o -size "+${hi}M" \)
               -print -quit )"
        ]] && printf '%s\n' "$dir"
    done
}

我用过" printf"因为" echo"如果其中一个目录名以-e或其他内容开头,则会中断。你可以将这个添加允许的目录添加到一个数组,而不是将它们打印到stdout,如果你真的想对有效的文件名产生偏执(因为你必须用while IFS= read循环解析它的输出或允许任何字符的东西,并且仍然在包含换行符的目录名称上中断。)

显然,SO的语法突出显示不知道$(command substitution)中引号的引用规则:/

答案 1 :(得分:1)

以下是3行的可能解决方案。我举一个具体的例子:

  1. 文件中包含大于1MB的所有文件的列表: du -hat 1M > gr.dat

  2. 将小于3MB的所有文件列表到另一个文件中: du -hat -3M > sm.dat

  3. 使用grep查找两个生成文件中的匹配项: grep -F -x -f gr.dat sm.dat