Есть ли более сжатая альтернатива трубопроводу для wc для подсчета файлов в каталоге

Если я делаю ls -1 target_dir | wc -l ls -1 target_dir | wc -l , я получаю количество файлов в каталоге. Я нахожу это немного громоздким. Есть ли более элегантный или лаконичный способ?

5 Solutions collect form web for “Есть ли более сжатая альтернатива трубопроводу для wc для подсчета файлов в каталоге”

Предполагая bash 4+ (какая у любой поддерживаемой версии Ubuntu есть):

 num_files() ( shopt -s nullglob cd -P -- "${1-.}" || return set -- * echo "$#" ) 

Назовите его num_files [dir] . dir является необязательным, иначе он использует текущий каталог. Ваша оригинальная версия не учитывает скрытые файлы, поэтому и не делает этого. Если вы хотите это, shopt -s dotglob перед set -- * .

В вашем исходном примере учитываются не только обычные файлы, но и каталоги и другие устройства – если вы действительно хотите только обычные файлы (в том числе символические ссылки на обычные файлы), вам нужно будет их проверить:

 num_files() ( local count=0 shopt -s nullglob cd -P -- "${1-.}" || return for file in *; do [[ -f $file ]] && let count++ done echo "$count" ) 

Если у вас есть GNU find, что-то вроде этого также является опцией (обратите внимание, что это включает скрытые файлы, которые ваша оригинальная команда не выполняла):

 num_files() { find "${1-.}" -maxdepth 1 -type f -printf x | wc -c } 

(change -xtype to -xtype если вы также хотите считать символические ссылки на обычные файлы).

f=(target_dir/*);echo ${#f[*]}

корректно работает для файла с пробелами, символами новой строки и т. д. в имени.

ls – многостолбцы, только если он выводится непосредственно на терминал, вы можете удалить опцию «-1». Вы можете удалить параметр wc «-l», только прочитать первое значение (ленивое решение, которое не должно использоваться для юридических свидетельства, криминальные расследования, критические задачи, тактические операции …).

 ls target | wc 

Если это кратковременность, которую вы испытываете (а не точную правильность при работе с файлами с символами новой строки в своих именах и т. Д.), Я рекомендую просто накладывать wc -l на lc («количество строк»):

 $ alias lc='wc -l' $ ls target_dir|lc 

Как отмечали другие, вам не нужна опция -1 для ls , так как она автоматическая, когда ls пишет в трубу. (Если вы не используете псевдонимы для использования режима столбцов, я видел это раньше, но не очень часто.)

Псевдоним lc весьма полезен в целом, и для этого вопроса, если вы посмотрите на случай «считать текущий каталог», ls|lc примерно так же кратким, как вы можете получить.

До сих пор Аарон – единственный подход, более сжатый, чем ваш собственный. Более правильная версия вашего подхода может выглядеть так:

 ls -aR1q | grep -Ecv '^\./|/$|^$' 

Это рекурсивно перечисляет все файлы, а не каталоги – по одному на строку, включая .dotfiles под текущим каталогом, используя оболочки оболочки, по мере необходимости, для замены непечатаемых символов. grep отфильтровывает любые списки родительских каталогов или .. или * / или пустые строки – поэтому должна быть только одна строка для каждого файла – общее количество, которое grep возвращает вам. Если вы хотите включить дочерние каталоги:

 ls -aR1q | grep -Ecv '^\.{1,2}/|^$' 

Удалите -R в любом случае, если вы не хотите рекурсивных результатов.

  • Как заставить логический том LVM2 RAID5 охватывать дополнительный физический том?
  • Обновление от Ubuntu до Crunchbang?
  • Отключить cronjob после перезагрузки
  • Соединение SSH с определенным сервером отказалось
  • Как добавить другую запись ОС в Wubi grub
  • Как получить адаптер Realtek RTL8811AU wifi, работающий на XUbuntu
  • Почему я могу получить доступ к моим дискам C: или D: от Ubuntu?
  • как я могу построить более старую версию gcc?
  • Как настроить две письма для двух разных пользователей в Ubuntu
  • Как записывать в каталог как часть сценария оболочки и делать число слов в файлах?
  • Autoconfig / Automake не может генерировать AM_CFLAGS & AM_LDFLAGS для зависимой библиотеки D-BUS. Зачем?
  • Linux и Unix - лучшая ОС в мире.