Як я можу підрахувати кількість папок на диску, використовуючи Linux?


24

Мені потрібно організувати зовнішній жорсткий диск таким чином, щоб на ньому було не більше 500 папок. На панелі "Властивості" Ubuntu відображається лише кількість файлів, а не кількість папок.

Чи є простий командний рядок, який підкаже мені кількість підкаталогів?

Мені потрібно рахувати рекурсивно, а привід - це зовнішній жорсткий диск, встановлений на /media/MUSIC/. Це для автомобільної стереосистеми, в документації якої написано, що вона читає лише перші 500 папок.

Відповіді:


20

Перейдіть на свій привід і просто виконайте виконання

ls -lR | grep ^d | wc -l

Схоже, це є більш правильним числом, ніж відповідь, яку я прийняв 3 роки тому. Він підраховував каталог, в якому я був, тоді як цього не робив.
Дін Швидше

Я бачу і різні числа, але не надто різні.
SPRBRN

Особисто я віддаю перевагу grep -cнад wc -l. Можливо, це лише я.
Maxim_united

1
Вищенаведене буде перерахунком, якщо будь-який запис каталогу містить послідовність \nd(де \nсимвол NL).
Toby Speight

1
Тобі вірно, lsвихід не повинен бути трубопровідним . Більше того, це буде набагато повільніше, оскільки воно має вивести все дерево, а потім
пропустити греп

37

Знайти всі папки, включаючи підкаталоги?

find /mount/point -type d | wc -l

... або знайти всі папки в кореневій директорії (не включаючи підкаталоги)?

find /mount/point -maxdepth 1 -type d | wc -l

Цей перший - саме те, за чим я йду. Спасибі!
Дін Швидше

@Dean: Так, я раніше використовував його для підрахунку каталогів у своїй музичній колекції. :) для прав браггіну рахуйте свої MP3: find / mount / point -type f | grep -i mp3 | wc -l
quack quixote

1
@Dean: Так, я не знаю синтаксису знаходження назовні, але я зазвичай використовую для цього grep -v : find / mount / pt -type f | grep -vi mp3 | grep -vi wav | wc -l ... (а <i> </i> не працює в коментарях, використовуйте *foo*для позначення курсивом: foo )
квакіт-кіхот

2
@Dean: я думаю, ви просто використали find /path -not -iname '*.mp3' | wc -lдля фільтрації MP3, або для використання MP3 і WAVfind /path -not -iname '*.mp3' -not -iname '*.wav' | wc -l
quack quixote

1
Потрібно додати -тип f , щоб він також ігнорував папки, але вітаю! Я щойно знайшов цілу купу файлів m4a, про які я поняття не мав ... Дякую!
Дін Швидше

4

Нові рядки є дійсними символами в іменах каталогу. Я пропоную дозволити findдрукувати порожній рядок для кожного знайденого каталогу, а потім дозволити wcрахувати ці рядки.

find /mount/point -type d -printf '\n' | wc -l

3

Спробуйте наступне [див. Нижче]:

ls -1 -p | grep "/" | wc -l

Це надрукує список одного стовпця поточного каталогу із задніми косою рисою елементів, які є підкаталогами, а потім порахує рядки з косою рисою.

РЕДАКТУВАТИ: Ви, мабуть, повинні відповісти на відповідь шарлатанського кіхота, оскільки це трохи явніше, але я виправив свою (після врахування пропозицій квактету).

ls -Rp | grep "/$" | wc -l

Потрібно додати -R, щоб перейти рекурсивно (вибачте за те, що не вдалося згадати), і потрібно вказати шлях до ls, але так, це працює: ls -1 -p -R / media / MUSIC / | grep "/" | wc -l Дякую!
Дін Швидше

Спробувавши як це, так і пропозицію кіхота, я отримав 2 різні результати ... Я схильний вірити іншому. Все одно, дякую!
Дін Швидше

1
вам не потрібно, -1оскільки ls виявить трубу і не буде форматувати стовпці. також ви можете захоплювати рекурсивні списки -R, але тоді, ймовірно, ви хочете, щоб "/$"відповідати лише відповідним косою косою рисою (інакше кількість буде вимкнено). остаточна версія:ls -Rp | grep "/$" | wc -l
квакш-кіхот

1
знахідка версія я розмістив підрахує .(тобто /mount/point) в рахунку, в LS версію в моєму вище коментарі не буде. ці підрахунки відрізняються на 1, тх, ви можете використовувати /mount/point/*в команді find, щоб виправити це (якщо не бути прихованих точкових каталогів).
шарлатаний кіхот

Я не впевнений, чому ви отримали два різні результати, але метод @ quack буде включати "приховані" каталоги (тобто ті, що починаються з ".").
каскадер

1

Я написав ffcnt для прискорення рекурсивного підрахунку файлів за конкретних обставин: обертових дисків та файлових систем, які підтримують відображення масштабів.

Це може бути на порядок швидше , ніж ніж lsабо findпідходи , засновані на


1

Коли існує велика кількість каталогів, такі інструменти, як, treeможливо, потребуватимуть вічності, щоб закінчити або навіть повісити, тож ви можете використовувати щось більш ефективне.

Найефективнішим способом підрахунку каталогів, про які я думаю, був би наступний, оскільки findбуде надруковано лише один .для кожної папки, знайденої замість повного шляху та імені файлу, і wcпотрібно лише повторити кількість символів:

find /mount/point -type d -printf '.' |wc -c

Щоб виключити /mount/pointсебе з обчислення та підрахувати лише підкаталоги:

find /mount/point -mindepth 1 -type d -printf '.' |wc -c

1

Я вважаю du --inodesкорисним, але я не впевнений, яка версія duцього вимагає. У Ubuntu 17.10 працює наступне:

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most

Поєднайте з | sort -nrсортування за спаданням за кількістю містять у них вузлів.


0

Мені подобається використовувати дерево, щоб тягнути підрахунок каталогу

tree -d -R -fi --noreport | wc -l

Або неправильне використання для пошуку більшої частини папок, розташованих із

find . -type d -printf "%h\n" | cut -d/ -f-2 | sort | uniq -c | sort -rn

Або щось на кшталт: дерево | grep -e '^. * каталоги,'
mindcrime

-2

Щоб знайти кількість папок і каталогів у поточному каталозі

Введіть наступну команду у свій термінал

echo */ | wc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.