bash:递归地查找包含最大数量的直接子文件的子目录

时间:2018-02-28 01:20:59

标签: bash find

我正在寻找一个在Bash中运行的shell命令,它找到包含最多文件数的子目录。执行时间不是一个大问题;很明显,需要一个大的拖网/排序操作来确定这个结果。问题是,如何计算?

我的第一个想法是使用find -type d -exec find {} -maxdepth 1 -type f | wc -l形式的命令,但事实证明你不能在这样的find命令中进行管道。

2 个答案:

答案 0 :(得分:2)

所以...基于find的选项可以工作,只要你的exec是shell,你仍然可以管道。

例如,也许这样,得到一个列表:

find /path -type d -exec sh -c 'find "$0" -maxdepth 1 -type f | wc -l' {} \; -print | paste - -

但是......我可能会用纯粹的bash来做这件事:

shopt -s globstar nullglob

for d in **/; do
  printf '%s\t%s\n' $( cd "$d"; a=(*); b=(*/); echo $((${#a[@]}-${#b[@]})) ) "$d"
done

在这两种情况下,结果都可以用数字排序并用管道修剪:

  | sort -nr | head -1

或者如果你对太多的管道很敏感,只需要一个小的awk脚本:

  | awk '$1>n{n=$1;line=$0} END {print line}'

我不确定哪一个更简单,找到或打击。我希望找到解决方案的速度会更快,但我很想听听你们每个人的结果。

请注意globstar需要bash 4或更高版本。

答案 1 :(得分:0)

事实证明,这样做的方法是使用bash脚本。这应该产生预期的结果:

(
    for path in $(find . -type d) ; do 
        # assigning the output to a variable strips the newline
        files=$(find "$path" -maxdepth 1 -type f | wc -l) ; 
        echo $files $path ; 
    done
) | sort -rg | head