Изолировать файлы и запустить на них wc
То, что wc -l /etc/*
делает это, *
будет распространяться на все элементы внутри /etc/
каталога. Таким образом, цель состоит в том, чтобы затем изолировать файлы и выполнить wc
на них. Есть несколько способов сделать это.
для цикла с тестом
Команда test
, или, более часто, сокращенно as, [
может использоваться для определения того, является ли элемент обычным файлом, например так:
[ -f "$FILE" ]
Таким образом, мы можем перебирать все элементы /etc/
и запускать wc
их, если и только если вышеприведенная команда возвращает true. Вот так:
for i in /etc/*; do [ -f "$i" ] && wc -l "$i" ; done
находить
Мы также можем использовать find
с -maxdepth
, -type
и -exec
флагами
find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} +
-maxdepth
информирует о том, как глубоко в структуре каталогов идти; значение 1 означает только те файлы в каталоге, который мы хотим.
-type f
говорит ему искать обычные файлы, ИЛИ (представленные -o
флагом) для символических ссылок (представленных type l
). Все эти качества заключены в квадратные скобки, ()
с \
которыми экранируются, так что оболочка интерпретирует их как часть find
команды, а не как-то еще.
-exec COMMAND {} +
Структура здесь запускает любую команду, которую мы ей даем, +
указывая , что нужно взять все найденные файлы и вставить их в качестве аргументов командной строки в КОМАНДУ.
Чтобы получить общее количество, мы могли бы выводить трубу tail
так
$ find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} + | tail -n 1
[sudo] password for xieerqi:
11196 total
Примечание
Его проще использовать wc -l /etc/* 2>/dev/null | tail -1
, как в ответе Л.Дж Джеймса, однако это find
должно стать частью привычки иметь дело с файлами, чтобы избежать обработки сложных имен файлов. Подробнее об этом читайте в эссе « Как правильно обращаться с именами файлов»