Нахождение количества файлов в каталоге для всех каталогов в pwd - PullRequest
4 голосов
/ 19 июня 2010

Я пытаюсь составить список всех каталогов и разместить рядом с ним количество файлов.

Я могу найти общее количество файлов ls -lR | grep .*.mp3 | wc -l.Но как я могу получить такой вывод:

dir1 34 
dir2 15 
dir3 2 
...

Я не против написать текстовый файл или CSV, чтобы получить эту информацию, если ее невозможно вывести на экран.

Спасибо всем за любую помощь в этом.

Ответы [ 5 ]

7 голосов
/ 19 июня 2010

Кажется, это работает, если вы находитесь в каталоге, где некоторые подкаталоги могут содержать mp3-файлы.Он опускает каталог верхнего уровня.В нем будут перечислены каталоги по порядку по наибольшему количеству содержащихся mp3-файлов.

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

Я обновил его с помощью print0, чтобы обрабатывать имена файлов с пробелами и другими хитрыми символами и выводить на печать вывод, подходящий для CSV.

4 голосов
/ 19 июня 2010
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}'
3 голосов
/ 19 июня 2010

Возможно, есть гораздо лучшие способы, но, похоже, это работает.

Поместите это в скрипт оболочки:

#!/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
0 голосов
/ 19 июня 2010

Вот еще один способ обработки имен файлов, содержащих необычные (но допустимые) символы, такие как переводы строк, ...:

# 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'" '{}' +
0 голосов
/ 19 июня 2010

С Perl:

perl -MFile::Find -le'
  find { 
    wanted => sub {
      return unless /\.mp3$/i;
      ++$_{$File::Find::dir};
      }
    }, ".";
  print "$_,$_{$_}" for 
    sort { 
      $_{$b} <=> $_{$a} 
      } keys %_;
  '
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...