Як я рахую всі файли рекурсивно через каталоги


47

Я хочу побачити, скільки файлів у підкаталогах, щоб дізнатися, де все використання inode у системі. Як би я це робив для використання місця

du -sh /*

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



Я думаю, що "скільки файлів у підкаталогах там, де є підкаталоги", є заплутаною конструкцією. Якщо більш чітко вказати, що ви хочете, ви можете отримати відповідь, яка відповідає законопроекту.
Стівен Д

@Steven сміливо переписую це ... Я подумав, що мій приклад du -sh /*дав зрозуміти, як я хочу, щоб граф працював. те саме, просто порахуйте файли, а не байти.
ксенотеррацид

Коли ви згадуєте про використання inode, я не розумію, чи хочете ви рахувати кількість файлів чи кількість використаних входів. Ці файли відрізняються, коли у файловій системі є жорсткі посилання. Більшість, якщо не всі, відповіді дають кількість файлів. Не використовуйте їх на резервному диску Apple Time Machine.
mouviciel

@mouviciel це не використовується на резервному диску, і так, я вважаю, що вони можуть бути різними, але в середовищі, в якому я перебуваю, дуже мало жорстких посилань, технічно мені просто потрібно відчути це. з'ясувати, де хтось горить там, в квоті inode.
ксенотеррацид

Відповіді:


60
find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done

Завдяки Жилу та ксенотерациду за виправлення безпеки та сумісності.

Перша частина: find -maxdepth 1 -type dповерне список усіх каталогів у поточному робочому каталозі. Це трубопровід до ...

Друга частина: while read -r dir; doпочинається цикл "час" - доки відкрита труба, що надходить у той час, (це стосується, поки не буде відправлений весь список каталогів), команда "читання" помістить наступний рядок у змінну "dir". Потім це продовжується ...

Третя частина: printf "%s:\t" "$dir";надрукує рядок у "$ dir" (у якому є одне з імен каталогів), після чого вкладка.

Четверта частина: find "$dir -f file"складає список усіх файлів усередині імені каталогу, що міститься у "$ dir". Цей список надіслано ..

П’ята частина: wc -l;підраховує кількість рядків, що надсилаються на його стандартний вхід.

Заключна частина: doneпросто закінчується цикл while.

Таким чином ми отримуємо список усіх каталогів у поточному каталозі. Для кожного з цих каталогів ми генеруємо список усіх файлів у ньому, щоб ми могли порахувати їх усі, використовуючи wc -l. Результат виглядатиме так:

./dir1: 234
./dir2: 11
./dir3: 2199
...

Завжди використовуйте read -rяк звичайне readлікування відводів. Тоді echo -en "$dir:\t"знову буде мазати нахили; просте виправлення - використовувати printf '%s:\t' "$dir"замість цього. Далі, $dirслід "$dir"( завжди використовувати подвійні лапки навколо змінних підстановок ).
Жил "ТАК - перестань бути злим"

змінено на пропозиції @Gilesfind -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" | wc -l; done
ксенотерацид

2
Я додаю sort -n -r -k2в кінці цього, для багатьох каталогів, щоб я знав, де найбільше використання
xenoterracide

Четверта частина: find "$ dir" складає список усіх файлів усередині імені каталогу, що міститься в "$ dir". Ви забули додати, -type fщоб зробити його списком файлів:find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
Krzysztof Boduch

@ krzysiek-boduch Дякую! Я оновив відповідь.
Шон Дж. Гофф

15

Спробуйте find . -type f | wc -l, він буде рахувати всі файли в поточному каталозі, а також усі файли в підкаталогах. Зауважте, що всі каталоги не вважатимуться файлами, а лише звичайні файли.


13

Ось компіляція корисних команд лістингу (повторно хеширована на основі коду попередніх користувачів):

Список папок із кількістю файлів:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type f | wc -l); printf "%4d : %s\n" $n "$dir"; done

Список папок з ненульовим числом файлів:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type f | wc -l); if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done

Список папок із кількістю підпапок:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; printf "%4d : %s\n" $n "$dir"; done

Список папок з ненульовим числом підпапок:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done

Список порожніх папок:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" | wc -l); let n--; if [ $n -eq 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done

Список не порожніх папок із кількістю вмісту:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" | wc -l); let n--; if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done

І btw .. якщо ви хочете мати вихід будь-якої з цих команд списку, відсортований за кількістю пунктів .. передайте команду у сортування: "a-list-command" | сортування -n
DolphinDream

12

Спробуйте:

find /path/to/start/at -type f -print | wc -l

як вихідна точка, або якщо ви дійсно хочете лише повторитись у підкаталогах каталогу (і пропустити файли в цьому каталозі верхнього рівня)

find `find /path/to/start/at -mindepth 1 -maxdepth 1 -type d -print` -type f -print | wc -l

+1 для чогось | wc -l ... кількість слів - це такий приємний маленький інструмент
Йохан

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

findпрацює рекурсивно за всіма підкаталогами за замовчуванням. Якщо ви хочете, щоб він працював у кількох місцях, ви можете вказати всі їх між findта -type.
Дідьє Троссет

це друге, звичайно, не працює .... Я спробував це вдома. Я отримав 698035 . Я повинен бачити близько 6 номерів.
ксенотерацид

Це працює для мене - ви впевнені, що у вас є лише 6 файлів /home? Я б на 100% впевнений, що ви цього не зробите.
Крик Хавок

4

Наступне рішення підраховує фактичну кількість використаних входів, починаючи з поточного каталогу:

find . -print0 | xargs -0 -n 1 ls -id | cut -d' ' -f1 | sort -u | wc -l

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

find . | wc -l

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


1
Гарна ідея з урахуванням важких посилань. Припускаючи , що GNU знахідку, вам не потрібно так багато кроків: find -printf '%i\n' | sort -u | wc -l. Якщо ви хочете бути портативними, вам знадобиться find . -exec ls -id {} + | cut …замість цього.
Жиль "ТАК - перестань бути злим"

2

OS X 10.6 задавлюється командою у прийнятій відповіді, оскільки не визначає шлях для find. Замість цього використовуйте:

find . -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done

2

Я знаю, що я спізнююся на вечірку, але я вважаю, що це чисте bash(або інша оболонка, яка приймає подвійну зіркову кулю) рішення може бути набагато швидшою в деяких ситуаціях:

shopt -s globstar    # to enable ** glob in bash
for dir in */; do a=( "$dir"/**/* ); printf "%s\t%s\n" "$dir:" "${#a[*]}"; done

вихід:

d1/:    302
d2/:    24
d3/:    640
...

1

Спробуйте:

find -type d -print0 | xargs -0 -I {} sh -c 'printf "%s\t%s\n" "$(find "{}" -maxdepth 1 -type f | wc -l)" "{}"'

Це повинно працювати нормально, якщо в назви файлів не входять нові рядки.


Таким чином, занадто рекурсивний ... Я хочу лише побачити верхній рівень, де він підсумовує все, що знаходиться під ним. сумарно ... це закінчує друк кожного каталогу.
ксенотерацид

@xenoterracide: Спробуйте додати -maxdepth 1одразу після першого find. Якщо ви хочете включити у свій рахунок кількість підкаталогів, видаліть -type fкінець (це справді ! -type dвсе-таки повинно було бути , щоб усі файли, що не містять каталогів, були включені).
Денніс Вільямсон

1

Якщо у вас ncduвстановлено (обов'язково, коли ви хочете зробити чистку), просто введіть c"Змінити відображення підрахунків підрахунків елементів". І Cдо "Сортування за елементами".


1
хаха, це повинна бути найкраще прийнята відповідь :)
x-yuri

0

du --іноди

Я не впевнений, чому ніхто (включаючи мене) не знав про:

du --inodes
--inodes
      list inode usage information instead of block usage

Я майже впевнений, що це вирішує проблему ОП. Я почав його багато використовувати, щоб дізнатися, де знаходяться всі мотлохи на моїх величезних накопичувачах (і завантажити його на більш старий диск).

Додаткова інформація

Якщо ви не хочете повторювати (що може бути корисно в інших ситуаціях), додайте

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