查找pwd中所有目录的目录中的文件数量

我试图列出所有的目录,并将其数量的文件旁边。

我可以find文件ls -lR | grep .*.mp3 | wc -l的总数 ls -lR | grep .*.mp3 | wc -l ls -lR | grep .*.mp3 | wc -l 。 但是我怎么能得到这样的输出:

 dir1 34 dir2 15 dir3 2 ... 

我不介意写一个文本文件或者CSV来获取这个信息,如果它不能在屏幕上显示的话。

谢谢大家对此有任何帮助。

可能有更好的方法,但这似乎工作。

把它放在shell脚本中:

 #!/bin/sh for f in * do if [ -d "$f" ] then cd "$f" c=`ls -l *.mp3 2>/dev/null | wc -l` if test $c -gt 0 then echo "$f $c" fi cd .. fi done 

这似乎工作假设你在一个目录中的一些子目录可能包含MP3文件。 它省略了顶层目录。 它将按照包含的最大数量的mp3文件的顺序列出目录。

 find . -mindepth 2 -name \*.mp3 -print0| xargs -0 -n 1 dirname | sort | uniq -c | sort -r | awk '{print $2 "," $1}' 

我用print0更新了这个,以处理空格和其他棘手字符的文件名,并打印适合CSV的输出。

 find . -type f -iname '*.mp3' -printf "%h\n" | uniq -c 

或者,如果命令(dir-> count而不是count-> dir)对你来说真的很重要:

 find . -type f -iname '*.mp3' -printf "%h\n" | uniq -c | awk '{print $2" "$1}' 

用Perl:

 perl -MFile::Find -le' find { wanted => sub { return unless /\.mp3$/i; ++$_{$File::Find::dir}; } }, "."; print "$_,$_{$_}" for sort { $_{$b} <=> $_{$a} } keys %_; ' 

这是甚至处理包含不寻常(但是合法)字符(例如换行符)的文件名的另一种方式,

 # count .mp3 files (using GNU find) find . -xdev -type f -iname "*.mp3" -print0 | tr -dc '\0' | wc -c # list directories with number of .mp3 files find "$(pwd -P)" -xdev -depth -type d -exec bash -c ' for ((i=1; i<=$#; i++ )); do d="${@:i:1}" mp3s="$(find "${d}" -xdev -type f -iname "*.mp3" -print0 | tr -dc "${0}" | wc -c )" [[ $mp3s -gt 0 ]] && printf "%s\n" "${d}, ${mp3s// /}" done ' "'\\0'" '{}' +