按项目数列出并排序子文件夹

按项目数列出并排序子文件夹

我正在尝试编写一个 bash 脚本来按项目数量列出和排序子文件夹。

以下是我所拥有的:

find * | wc -l用于返回项目数量。

并且for f in *; do echo "$f"; find "$f" | wc -l ; done可以工作,但是列表很难解析。

所以我尝试使用printf

for f in *; do 
   c=`echo find "$f" | wc -l` ; 
   printf "$c $f\n"; 
done

但它会返回1每个子文件夹。

我想根据每个子文件夹中的项目数量对最终列表进行排序。

答案1

这引起了我的兴趣,所以我尝试了一下,这是我的代码:

#!/bin/bash

startIFS=$IFS
IFS=$'\n'

function echocount {
dirs=$(find -type d)
for f in $dirs; do
   c=$(find "$f" -maxdepth 1 -type f | wc -l) ;
   echo "$c $f";
done
}

echocount | sort -n

IFS=$startIFS

我发现这个非常在 shell 脚本中这很愚蠢而且烦人,但我需要更改 IFS,以便只有换行符而不是空格才表示另一个目录,并且循环才能正确运行。

顺便说一句,在您的代码中,它始终计数为 1 的原因是因为在 中echo find "$f" | wc -l,您实际上是在计算 中的行数echo find "$f",而这些行数始终是一行(它只是字面上回应“查找任何内容”,而不是实际运行 find 命令)。如果您将其取出echo,它将按您的预期执行。

另外,学究们会告诉你反引号符号已被弃用。无论如何,我发现 $() 符号更具可读性。

答案2

在 localhost 的指导下,我的解决方案是:

for f in */; do 
  c=$(find "$f" | wc -l) ; 
  printf "$c $f\n"; 
done | sort -n

相关内容