我一直在尝试用管道在单行上实现此功能,但是我却没有做到。如果您能帮助我,我将不胜感激。
这是我的代码:
#!/bin/bash
subdir=$(find $1 -type d)
for ft in $subdir
do
nFiles=$(find $ft -maxdepth 1 -type f | wc -l)
echo $ft $nFiles
done
exit 0
这是我试图做的,但是没用:
find $directori -type d -exec find {} -maxdepth 1 -type f \; | wc -l
答案 0 :(得分:2)
赞:
find "${1}" -type d -exec bash -c 'echo "${1} $(find "${1}" -maxdepth 1 -type f -printf "." | wc -c)"' -- {} \;
答案 1 :(得分:1)
|
由外壳处理,该外壳重定向相关命令的输出和输入。
它不能直接在-exec ...
内使用,因为find
没有提出这样的功能。
可以使用-print0
来避免带有特殊字符的文件名破坏命令。
可以从echo - open group issue 7页中阅读此句子:
鼓励新应用程序使用printf代替echo。
尝试一下(编辑,参见@CharlesDuffy的评论):
find "${directori}" -type d -print0 | xargs -0 sh -c 'for ft ; do printf "%s " "${ft}" ; find "${ft}" -maxdepth 1 -type f -printf "\n" | wc -l ; done' sh
最后的sh
用于设置$0
,请参见man sh
。
答案 2 :(得分:0)
这是管道的另一种选择,我觉得它更具可读性:
find $1 -type d | while IFS='' read -r ft; do nFiles=$(find $ft -maxdepth 1 -type f | wc -l); echo $ft $nFiles; done; exit 0
您还可以避免分配nFiles:
find $1 -type d | while IFS='' read -r ft; do echo "$ft $(find $ft -maxdepth 1 -type f | wc -l)"; done; exit 0