Підраховуючи рядки з wc, не друкуйте помилку щоразу, коли це каталог


12

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

xxxx is a directory 
yyyy is a directory
total 1752

Моє запитання: як я можу позбутися (видалити) ці коментарі, і чи є кращий спосіб зробити цей вид підрахунку?


1
Я думаю, що використання find не є на 100% райт, тому що в / etc є не тільки звичайні файли f, але і посилання l. тому ця версія набагато краща: $ sudo wc -l / etc / * 2> / dev / null | хвіст -1
Хамза

Відповіді:


14

Ви можете вивести повідомлення про помилки в / dev / null

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

За допомогою цієї команди ви бачите лише кількість рядків у файлах, які читаються у всьому світі. Щоб побачити кількість рядків усіх файлів, вам слід було б збільшити команду sudo.

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

8

Виділіть файли та запустіть wc на них

Що wc -l /etc/*робити, це *розшириться на всі елементи всередині /etc/каталогу. Таким чином, мета - ізолювати файли та виконувати wcїх. Існує кілька способів зробити це.

для циклу з тестом

testКоманда, або частіше скорочено [можна використовувати , щоб знайти елемент , чи є звичайним файлом наступним чином:

[ -f "$FILE" ]

Таким чином, ми можемо зробити ітерацію над усіма елементами в /etc/і запустити wcїх, якщо і лише тоді, коли вищевказана команда поверне справжнє значення. Так:

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має бути частиною звички працювати з файлами, щоб уникнути обробки складних імен файлів. Для отримання додаткової інформації про це читайте есе Як правильно поводитися з іменами


5

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}'

EDIT : newlinesпомилка kos сказана. Тільки використовуючи -execйого випрямляє. Крім того, /etcтакі файли не містять.

Вихід:

8169

Як вказує kos , вищевказану команду можна звести до:

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

EDIT : newlinesпомилка kos сказана. Тільки використовуючи -execйого випрямляє. Крім того, /etcтакі файли не містять.

Вихід:

8169

4
Яка мета -iname '*'? не findвідповідає всім за замовчуванням?
steeldriver

@steeldriver - Без мене це не вийшло '*'.
Рафаель

2

Використовуючи z-shell ( zsh), королева снарядів замість bash.

sudo wc -l /etc/*(.) | tail -1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.