我正在寻找一个在Bash中运行的shell命令,它找到包含最多文件数的子目录。执行时间不是一个大问题;很明显,需要一个大的拖网/排序操作来确定这个结果。问题是,如何计算?
我的第一个想法是使用find -type d -exec find {} -maxdepth 1 -type f | wc -l
形式的命令,但事实证明你不能在这样的find命令中进行管道。
答案 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