2013-12-10 66 views
0

我挣扎了几个小时数得到这个uggly线工作打印递归的文件夹中

wcr() { find "[email protected]" -type d | while read F; do find $F -maxdepth 0 && printf "%5d " $(ls $F | wc) && printf "$F"; done; echo; } 

下面是结果

39 41 754 ../matlab.sh 
1 1 19 ./matlab.sh./micmac 
1 1 14 ./micmac 

我的第一个问题是:我该怎么写呢聪明吗?

第二个问题:我想在计数之前打印的名字,但我不知道如何制表的输出,所以我不能做的比这更好:

. 
./matlab.sh 1 1 19 
./matlab.sh./micmac 1 1 19 
./micmac 1 1 14 
+0

Tabulate?你的意思是对齐列?你认为如果第一列中的一个值很长,这看起来会非常难看吗? – Alfe

回答

3
  1. 我看不出有什么find $F -maxdepth 0应该是有益的,所以我会将其剥离。
  2. 此外,如果文件名包含%,如果您将它用作printf的格式字符串,则会遇到问题,因此我会添加一个明确的格式字符串。我将两个printf组合起来。要切换列(有关此主题的更多信息,请参阅下文),只需切换参数并相应地调整格式字符串即可。
  3. 您应该使用双引号使用变量("$F"而不是$F),以避免文件名中包含空格或其他内容的问题。
  4. 然后,如果一个文件以空格开头,那么你的read会跳过这些,导致结果变量无用。为避免这种情况,请在读取时将IFS设置为空字符串。
  5. 要获取目录条目的数量,您应该使用选项-l代替wc,以仅对(而不是单词和字符)进行计数。
  6. 使用选项--sort=nonels通过避免无用的排序来加快速度。
  7. 使用选项-bls来转义文件名中的换行符,从而避免中断计数。
  8. 如果您希望其他人阅读您的代码,请正确缩进代码。

这是结果:

wcr() { 
    find "[email protected]" -type d | while IFS='' read F 
    do 
     printf "%5d %s\n" "$(ls --sort=none -b "$F" | wc -l)" "$F" 
    done 
    echo 
} 

我会反对切换列。可能最宽的列应该在最后(在这种情况下是文件的路径)。否则,你将不得不忍受不可读的输出。但是如果你真的想这样做,你必须做两遍:一是确定最长的输入,另一个是相应的格式化输出。

+0

感谢您的详细解答和所有提示。 我发现bash脚本比我以前学过的任何其他语言都要复杂得多。我希望在练习时能够流利一些。 – quickbug

+1

感谢您的详细解答和所有提示。 我发现bash脚本比我以前学过的任何其他语言都要复杂得多。我希望在练习时能够流利一些。 这就是为什么我在寻求帮助之前努力获得一些(种)工作'东西') – quickbug

1
for i in $(find . -type d); do 
    printf '%-10s %s\n' "$(ls $i | wc -l)" "$i" 
done 

你也许可以预先处理输出,并使用使与任何顺序的一些发烧友的输出,但是由于路径可以得到很大的,这样做可能是简单的。

+0

当目录包含一个空格名称时,你的命令将跳闸。 – Bernhard

+0

谢谢你的'专栏'技巧。我将它加入书签供以后使用。 – quickbug