我正在尝试编写一个 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