将此程序简化为一行

时间:2019-03-06 10:28:20

标签: bash shell

我一直在尝试用管道在单行上实现此功能,但是我却没有做到。如果您能帮助我,我将不胜感激。

这是我的代码:

#!/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

3 个答案:

答案 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