Записывать записи для каждой директории в дереве

Скажем, у меня есть следующее дерево:

root: d foo d bar /foo: d A - tmp.txt /bar: d B - tmp2.txt /foo/A: - tmp3.txt /bar/B: 

d = каталог и – = файл

Мне нужно ответить на следующий вопрос: какой каталог (исключая корень) содержит наименьшие записи?

я пытался

  find . | grep -oE '/([a-zA-Z]+/)+' 

чтобы получить количество вхождений для каждого каталога. Проблема заключается в том, что эта команда исключает пустые каталоги, в этом случае / bar / B исключается.

Любые рекомендации относительно того, как решить эту проблему, будут оценены.

2 Solutions collect form web for “Записывать записи для каждой директории в дереве”

С инструментами GNU:

 find . -printf '%h\0' -type d ! -name . -print0 | sort -z | uniq -zc | sort -zn | sed -zq | tr '\0' '\n' 

Если вы можете гарантировать, что имена файлов не будут содержать символы новой строки, вы можете упростить его:

 find . -printf '%h\n' -type d ! -name . -print | sort | uniq -c | sort -n | head -n1 

(число зарегистрированных – количество файлов в каталоге минус 1 ( . подсчитано, но не .. )).

С zsh :

 count() { set -- $REPLY/*(NDoN) REPLY=$# } print -r -- **/*(Do+count[1]) 

Вы можете использовать что-то вроде этого:

 find . -type d -exec sh -c \ 'printf -- "%-20s: " {}; find {} -maxdepth 1 -type f -printf "%i\n" | wc -l' \; 

Если у вас есть это дерево, ( tree – хорошая команда кстати.):

 $ tree -a . . ├── bar │  ├── B │  └── tmp2.txt ├── ff ├── .ff.swp └── foo ├── A │  └── tmp3.txt ├── f2.txt ├── f3.txt └── tmp.txt 

Вы получите следующее:

 . : 2 ./foo : 3 ./foo/A : 1 ./bar : 1 ./bar/B : 0 

Чтобы перечислить одно из меньших (более того, можно было бы иметь, например, нулевые файлы), можно было бы сделать что-то вроде:

 find . -type d -exec sh -c \ 'find "{}" -maxdepth 1 -type f -printf "%i\n" | \ wc -l | xargs printf "%-2d"; printf ": %s\n" "{}" ' \; | sort -k1,1 | head -n 1 

если папки не содержат новую строку.


Если -maxdepth недоступен, альтернативой может быть:

 find . -type d -exec sh -c \ 'printf -- "%-20s: " "{}"; find "{}" ! -wholename "{}" -prune -type f -printf "%i\n" | wc -l' \; 
  • Как вы определяете доступность файловой системы из сценария bash?
  • Сценарий оболочки для назначения значений из таблицы поиска слишком медленный
  • xargs - добавить каждый аргумент с параметром
  • Используя цикл «for», запустите сценарий для всех файлов в каталоге
  • проверьте, успешно ли genisoimage
  • В Bash, когда к псевдониму, когда скрипту, а когда писать функцию?
  • Самый быстрый способ найти и заменить в большом файле при замене поля в другом файле
  • Я хочу запустить команду cut, чтобы извлечь какой-либо столбец из большого файла и вставить его в другой файл:
  • Объединение файлов по строкам
  • подсчеты совпадений и несоответствий
  • Как запустить скрипт с другого пути и узнать путь к скрипту?
  • Linux и Unix - лучшая ОС в мире.