我试图列出所有的目录,并将其数量的文件旁边。
我可以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'" '{}' +