У меня есть каталог с большим количеством файлов. Я не вижу переключателя ls
для получения количества файлов. Есть ли какая-то магия командной строки, чтобы получить количество файлов?
Используя широкое определение понятия "файл"
ls | wc -l
(обратите внимание, что оно не учитывает скрытые файлы и предполагает, что имена файлов не содержат символов новой строки).
Чтобы включить скрытые файлы (кроме .
и ..
) и избежать проблем с символами новой строки, каноническим способом является:
find . ! -name . -prune -print | grep -c /
Или рекурсивно:
find .//. ! -name . -print | grep -c //
Для узкого определения файла:
find . -maxdepth 1 -type f | wc -l
Возможно, наиболее полный ответ, используя пара ЛС
/туалет
- это
ls -Aq | wc -l
если вы хотите рассчитывать Dot-файлов, и
ls -q | wc -l
в противном случае.
-А
- посчитать Dot-файлов, но опустить .
и ..
.-м
сделать ЛС
заменить неграфические символы, особенно символ новой строки, с ?
, вывод сделать 1 строку для каждого файлаЧтобы получить одну строку вывода команды ls
в терминал (т. е. без закачивания в туалет
), -1
параметр должен быть добавлен.
(поведение команды ls
протестирован с coreutils 8.23)
Если вы знаете, что текущий каталог содержит хотя бы один не скрытый файл:
set -- *; echo "$#"
Очевидно, что это можно обобщить на любой glob.
В сценарии это имеет иногда неприятный побочный эффект перезаписи позиционных параметров. Это можно обойти, используя вложенную оболочку или функцию (версия Bourne/POSIX), например:
count_words () {
eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"
Альтернативным решением является $(ls -d -- * | wc -l)
. Если glob - *
, команда может быть сокращена до $(ls | wc -l)
. Парсинг вывода ls
всегда вызывает у меня беспокойство, но здесь он должен работать, если только имена ваших файлов не содержат новых строк, или ваш ls
их экранирует. А $(ls -d -- * 2>/dev/null | wc -l)
имеет преимущество в том, что изящно обрабатывает случай несовпадения glob (т.е. возвращает 0 в этом случае, тогда как метод set *
требует сложной проверки, если glob может быть пустым).
Если имена файлов могут содержать символы новой строки, альтернативой может быть использование $(ls -d ./* | grep -c /)
.
Любое из этих решений, основанное на передаче расширения glob в ls
, может завершиться ошибкой argument list too long при большом количестве подходящих файлов.
Я нашел дю --дескрипторы полезного, но я'м не знаете, какую версию " дю " она требует. Он должен быть существенно быстрее, чем альтернативные подходы, используя
найтии
туалет`.
На Ubuntu 17.10, следующие работы:
du --inodes # all files and subdirectories
du --inodes -s # summary
du --inodes -d 2 # depth 2 at most
Совмещать с | сортировка -НР
для сортировки по убыванию по количеству, содержащий индексные дескрипторы.
После установки дерева команд, просто введите:
"дерево"
Если вы тоже хотите, чтобы скрытые файлы:
дерево -
Если вы используете Дебиан / Минт / Убунту Linux введите следующую команду для установки дерева команд:
судо apt-получить установку дерева
Опция -L используется для указания максимального уровня отображение дерева каталогов. Дерево команд не только подсчитать количество файлов, но и каталогов, учитывая, как много уровней дерева каталога, как вам нравится.
find -maxdepth 1 -type f -printf . | wc -c
-параметр maxdepth 1
сделает его нерекурсивный, найти
является рекурсивным по умолчанию-тип F
будет содержать только файлы | туалет -с
подсчет символовЗдесь's и другую технику вдоль линии один запостил Жиль:
word_count () { local c=("$@"); echo "${#c[@]}"; }
file_count=$(word_count *)
которая создает массив с 13,923 элементов (если это's сколько файлов есть).
find . -type f -maxdepth 1 | wc -l
Это может только список файлов в текущем каталоге.
На Linux, чтобы сделать команду очень надежный и обрабатывать файлы, которые могут иметь строк в свое имя, используйте это:
find -maxdepth 1 -type f -print0 | tr -cd '\0' | wc -c
Это спасает нас от испытание выходной парсинг команды ls
.
Связанные:
Совершенствование некоторых ответов, прежде чем но на этот раз делает явно.
$ tree -L 1 | tail -n 1 | cut -d " " -f 3
Это'ы достойны видеть использование ваши близкие команды, как хвост
и резать
.
Также обратите внимание, что дерево не доступен по умолчанию. Команду над первым захватить информацию о каталоге 1-го уровня, тогда вам в последней строке хвоста -Н 1
где наша цель, и в конечном итоге с резать
, чтобы занять третье слово.
Например, размещая в /
:
/ $ tree -L 1
.
├── 1
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var
20 directories, 1 file
/ $ tree -L 1 | tail -n 1
20 directories, 1 file
/ $ tree -L 1 | tail -n 1 | cut -d " " -f 3
1
То, что задавать количество каталогов?
Используйте команду дерево
, просто:
tree