When counting lines with wc, don't print an ошибка whenever is в directory

I want to count the полный number of lines in all /etc поля but not the поля in the sub directories, so I typed: wc -l /etc/* | tail -1 and the output is like:

xxxx is a directory 
yyyy is a directory
total 1752

My question is, how хан I rid of (delete) these comments, and is there в better way to do this type of count?

12
задан 2 January 2016 в 09:23

4 ответа

Можно произвести сообщения об ошибках к/dev/null

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

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

$ sudo wc -l /etc/* 2>/dev/null | tail -1
14
ответ дан 23 November 2019 в 03:30

Используя z-оболочка (zsh), королева оболочек , вместо удара.

sudo wc -l /etc/*(.) | tail -1
2
ответ дан 23 November 2019 в 03:30

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

Что 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 флаг) для ссылок sybolic (представленный type l ). Все то совершенство включается в скобки () оставленный с \ так, чтобы оболочка интерпретировала их как часть к find команда, а не что-то еще.
  • -exec COMMAND {} + структура здесь выполняет любую команду, которую мы даем ей, + указание, чтобы взять все найденные файлы и наполнить их как командную строку args к КОМАНДЕ.

Для создания общего количества, мы могли передать вывод по каналу к 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, как в L. D. Ответ James, однако find должна быть часть привычки для контакта с файлами, чтобы не обрабатывать трудные имена файлов. Для большего количества информации о том чтении эссе, Как иметь дело с именами файлов правильно

8
ответ дан 23 November 2019 в 03:30

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 ошибка сказанный Кос преобладает. Только использование -exec исправляет его. Кроме того, /etc не содержит такие файлы.

Вывод:

8169

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

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

Править: newlines ошибка сказанный Кос преобладает. Только использование -exec исправляет его. Кроме того, /etc не содержит такие файлы.

Вывод:

8169
5
ответ дан 23 November 2019 в 03:30

Другие вопросы по тегам:

Похожие вопросы: