При подсчете строк с помощью 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