我正在尝试列出所有目录并将其文件数放在它旁边。
我可以找到文件总数ls -lR | grep .*.mp3 | wc -l
。但是我怎样才能获得这样的输出:
dir1 34
dir2 15
dir3 2
...
如果无法在屏幕上显示此信息,我不介意写入文本文件或CSV来获取此信息。
谢谢大家对此的任何帮助。
答案 0 :(得分:7)
这似乎可以正常工作,假设您所在的目录中某些子目录可能包含mp3文件。它省略了顶级目录。它将按最大数量的包含mp3文件的顺序列出目录。
find . -mindepth 2 -name \*.mp3 -print0| xargs -0 -n 1 dirname | sort | uniq -c | sort -r | awk '{print $2 "," $1}'
我用print0更新了这个,以处理带有空格和其他棘手字符的文件名,并打印适合CSV的输出。
答案 1 :(得分:4)
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}'
答案 2 :(得分:3)
可能有更好的方法,但这似乎有效。
将它放在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
答案 3 :(得分:0)
使用Perl:
perl -MFile::Find -le'
find {
wanted => sub {
return unless /\.mp3$/i;
++$_{$File::Find::dir};
}
}, ".";
print "$_,$_{$_}" for
sort {
$_{$b} <=> $_{$a}
} keys %_;
'
答案 4 :(得分:0)
这是另一种处理包含异常(但合法)字符的文件名的方法,例如换行符,......:
# 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'" '{}' +