Записи количества для каждого каталога в дереве

Если prefix=/home/foo/usr не работает, пробуют:

CFLAGS=-I/home/foo/usr/include LDFLAGS=-L/home/foo/usr/lib ./configure
1
10.11.2013, 21:26
2 ответа

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

find . -printf '%h\0' -type d ! -name . -print0 |
  sort -z |
  uniq -zc |
  sort -zn |
  sed -z q |
  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])
5
27.01.2020, 23:15

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

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

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

$ 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' \;
1
27.01.2020, 23:15

Теги

Похожие вопросы