Відповіді:
Якщо припустити, що потрібно лише рекурсивний підрахунок файлів, а не каталогів та інших типів, щось подібне повинно працювати:
find . -maxdepth 1 -mindepth 1 -type d | while read dir; do
printf "%-25.25s : " "$dir"
find "$dir" -type f | wc -l
done
find
… -print0 | xargs -0
....
bash
alias
!!
sort -rn -k 2,2 -t$':'
ви отримуєте список DESC
Це завдання мене настільки захопило, що я хотів сам знайти рішення. Це навіть не потребує певного часу, і МОЖЕ бути швидше у швидкості виконання. Потрібно сказати, що зусилля Тор допомогли мені дуже детально зрозуміти речі.
Тож ось моя:
find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "{} : $(find "{}" -type f | wc -l)" file\(s\)' \;
Це виглядає скромно з причини, адже це набагато потужніше, ніж виглядає. :-)
Однак якщо ви маєте намір включити це у свій .bash_aliases
файл, він повинен виглядати так:
alias somealias='find . -maxdepth 1 -mindepth 1 -type d -exec sh -c '\''echo "{} : $(find "{}" -type f | wc -l)" file\(s\)'\'' \;'
Зверніть увагу на дуже складне поводження з вкладеними єдиними цитатами. І ні, не можна використовувати подвійні лапки для sh -c
аргументу.
strace -fc script
. Ваша версія робить приблизно на 70% більше системних викликів. +1 для коротшого коду :-)
find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "$(find "{}" -type f | wc -l)" {}' \; | sort -nr
find . -type f | cut -d"/" -f2 | uniq -c
Перераховує папки та файли у поточній папці із кількістю файлів, знайдених під ними. Швидкий і корисний ІМО. (файли показують з підрахунком 1).
| sort -rn
сортування підкаталів за кількістю файлів.
Використання знахідки - це безумовно шлях, якщо ви хочете рахувати рекурсивно, але якщо ви просто хочете підрахунок файлів безпосередньо під певним каталогом:
ls dir1 | wc -l
ls -d */ | xargs -n1 ls | wc -l
(Однак скористайтеся прийнятою вами відповіддю, якщо вона вже працює! Це просто А тепер ви знаєте.)
find
це так важливо. ( НЕ кажучи вже -print0
і xargs -0
вже вказав Скотт в іншу відповідь)
find . -mindepth 1 -type d -print0 | xargs -0 -I{} sh -c 'printf "%4d : %s\n" "$(find {} -type f | wc -l)" "{}"'
Мені часто потрібно підраховувати кількість файлів у моїх підкаталогах і використовувати цю команду. Я вважаю за краще, щоб підрахунок був першим.
Що я використовую ... Це робить масив усіх підкаталогів у тому, який ви даєте в якості параметра. Роздрукуйте підкаталог та кількість цього ж підкаталогу, поки не будуть оброблені всі підкаталоги.
#!/bin/bash
directories=($(/bin/ls -l $1 | /bin/grep "^d" | /usr/bin/awk -F" " '{print $9}'))
for item in ${directories[*]}
do
if [ -d "$1$item" ]; then
echo "$1$item"
/bin/ls $1$item | /usr/bin/wc -l
fi
done
Ви можете використовувати цей код python. Завантажте інтерпретатор, запустивши python3
та вставте:
folder_path = '.'
import os, glob
for folder in sorted(glob.glob('{}/*'.format(folder_path))):
print('{:}: {:>8,}'.format(os.path.split(folder)[-1], len(glob.glob('{}/*'.format(folder)))))
Або рекурсивна версія для вкладених підрахунків:
import os, glob
def nested_count(folder_path, level=0):
for folder in sorted(glob.glob('{}/'.format(os.path.join(folder_path, '*')))):
print('{:}{:}: {:,}'.format(' '*level, os.path.split(os.path.split(folder)[-2])[-1], len(glob.glob(os.path.join(folder, '*')))))
nested_count(folder, level+1)
nested_count('.')
Приклад виводу:
>>> figures: 5
>>> misc: 1
>>> notebooks: 5
>>> archive: 65
>>> html: 12
>>> py: 12
>>> src: 14
>>> reports: 1
>>> content: 6
>>> src: 1
>>> html_download: 1