Ответы:
Предполагая, что вам нужно только рекурсивное количество файлов, а не каталогов и других типов, что-то вроде этого должно работать:
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
чтобы отсортировать подкаталоги по количеству файлов.
Использование find - определенно хороший способ, если вы хотите считать рекурсивно, но если вы просто хотите подсчитать файлы непосредственно в определенном каталоге:
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