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

时间:2010-06-19 11:56:50

标签: linux bash shell command-line

我正在尝试列出所有目录并将其文件数放在它旁边。

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

dir1 34 
dir2 15 
dir3 2 
...

如果无法在屏幕上显示此信息,我不介意写入文本文件或CSV来获取此信息。

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

5 个答案:

答案 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'" '{}' +