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?
Можно произвести сообщения об ошибках к/dev/null
$ wc -l /etc/* 2>/dev/null | tail -1
С этой командой, Вы только видите количество строк в файлах, которые являются читаемым миром. Для наблюдения количества строк всех файлов, у Вас была бы к поднятому команда с sudo
.
$ sudo wc -l /etc/* 2>/dev/null | tail -1
Используя z-оболочка (zsh
), королева оболочек , вместо удара.
sudo wc -l /etc/*(.) | tail -1
Что 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
должна быть часть привычки для контакта с файлами, чтобы не обрабатывать трудные имена файлов. Для большего количества информации о том чтении эссе, Как иметь дело с именами файлов правильно
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