При подсчете строк с помощью wc не печатайте сообщение об ошибке, если каталог

Я хочу посчитать общее количество строк во всех /etc файлы, но не файлы в подкаталогах, поэтому я набрал: wc -l /etc/* | tail -1 и вывод выглядит так:

xxxx is a directory 
yyyy is a directory
total 1752

Мой вопрос, как я могу избавиться (удалить) эти комментарии, и есть ли лучший способ сделать этот тип подсчета?

4 ответа

Вы можете вывести сообщения об ошибках в /dev/null

$ wc -l /etc/* 2>/dev/null | tail -1

С помощью этой команды вы видите только количество строк в файлах, которые доступны для чтения всем пользователям. Чтобы увидеть количество строк во всех файлах, вам нужно поднять команду с помощью sudo,

$ sudo wc -l /etc/* 2>/dev/null | tail -1

Изолируйте файлы и запустите на них wc

Какие wc -l /etc/* делает это * будет расширяться на все предметы внутри /etc/ каталог. Таким образом, цель состоит в том, чтобы затем изолировать файлы и выполнить wc на них. Есть несколько способов сделать это.

для цикла с тестом

test команда или более часто сокращенно как [ может использоваться для определения того, является ли элемент обычным файлом, например:

[ -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 должно быть частью привычки иметь дело с файлами, чтобы избежать обработки сложных имен файлов. Подробнее об этом читайте в эссе " Как правильно обращаться с именами файлов"

find делает это легко:

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*')

Выход:

...
828 /etc/mime.types
25 /etc/ts.conf
66 /etc/inputrc
 0 /etc/subgid-
8169 total

НО, если вы просто хотите, чтобы число выводилось и ничего больше:

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*') | grep total | awk '{print $1}'

РЕДАКТИРОВАТЬ: newlines ошибка kos сказал, преобладает. Только используя -exec исправляет это. Также, /etc не содержит таких файлов.

Выход:

8169

Как указано в kos, приведенная выше команда может быть уменьшена до:

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*') | awk 'END {print $1}'

РЕДАКТИРОВАТЬ: newlines ошибка kos сказал, преобладает. Только используя -exec исправляет это. Также, /etc не содержит таких файлов.

Выход:

8169

Используя z-shell (zsh), королева снарядов, а не Баш.

sudo wc -l /etc/*(.) | tail -1
Другие вопросы по тегам