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

Fat*_*ebi 6 linux bash

我想列出文件大小都在一个范围内的目录.我的解决方案是查看每个目录,如果它的所有文件大小在范围内,则显示出来.我想知道是否有更容易的方法来检查像find命令或任何其他命令这样的开关.

例如:范围= 10 - 20

dir1:
f1 size=12
f2 size= 19

dir2:
f3 size=22
f4 size=11

OUTPUT = dir1
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*des 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
}
Run Code Online (Sandbox Code Playgroud)

我使用“printf”,因为如果目录名称之一以-e某种方式开头,“echo”就会中断。如果您确实想对有效文件名保持偏执,则可以将允许的目录添加到数组中,而不是将它们打印到标准输出(因为您必须使用循环或允许任何while IFS= read字符的内容来解析此输出,并且仍然会破坏包含换行符的目录名称。)

显然SO的语法高亮不知道里面引号的引用规则$(command substitution):/