Intereting Posts
Как оптимизировать «grep'-and-save»? Настроить ошибку «Компилятор C не может создавать исполняемые файлы» Различия между обложками хромовой ОС? Каков самый простой способ клонирования встроенной SD-карты Linux? apt-get update: Как проверить ошибки GPG при использовании скриптов? Конфигурация Nginx – заголовки кэша на определенных путях В чем разница между прикрепленным и отсоединенным экраном? Ошибка qmake при установке PyQt5 Разделение Домашнего каталога двумя разными разделами Как преобразовать выходные данные scripts / get_maintainer.pl в качестве входных данных для пересылки сообщений в почтовый ящик или git-send? Почему файлы на подключенном smbfs-ресурсе создаются с помощью исполняемого битового набора? как использовать shell-скрипт с snmpwalk с OID, чтобы иметь идентификатор vlan, имя vlan, порт принадлежит vlans в таблице Excel что такое oldroot? Сделать curl / cat не прокручивать вниз, если вам нужен длинный текст? Добавление метки времени при перемещении файла в bash

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

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

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 исключается.

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

С инструментами 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' \;