Я пытаюсь сравнить вывод команд между двумя серверами. Я хочу узнать количество строк из вывода команд, таких как ls -l
. Есть ли способ сделать это? Пока я ничего не нашел.
решение1
Для кого-то это может быть проще запомнить:
ls -l | grep . -c
Обратите внимание, что и grep, и wc будут подсчитывать вспомогательные строки, такие как total 32044
или или ./dirname:
. Чтобы избежать этого, особенно в рекурсивном выводе, ls -lR
попробуйте это:
find . -type f | grep . -c
где first .
— это путь к каталогу, и -type f
означает, что find
будут перечислены только файлы. Если вам нужны все типы (включая каталоги, сокеты и т. д.), то просто опустите -type f
.
Обратите внимание: wc -l
пустые строки (только '\n') учитываются, а grep . -c
- — НЕ учитываются.
решение2
Вам следует использовать wc
:
$ wc -l .emacs.d/init.el
73 .emacs.d/init.el
От man wc
:
NAME
wc - print newline, word, and byte counts for each file
SYNOPSIS
wc [OPTION]... [FILE]...
wc [OPTION]... --files0-from=F
....
-l, --lines
print the newline counts
wc
является частью GNU coreutils
, вы можете иметь его в большинстве Unix-like
систем.
решение3
Вы можете передавать свою команду wc
команде:
ls -l | wc -l
решение4
Если вы хотите сравнить количество файлов, обработанных каждым из серверов, то это можно сделать следующим образом:
ls -aR1qp ./ | grep -cv '/\|^$'
Это рекурсивно перечисляет все файлы - не каталоги - по одному на строку, включая .dotfiles
ниже текущего каталога, используя подстановки оболочки по мере необходимости для замены непечатаемых символов. grep
отфильтровывает любые списки родительских каталогов или ..
или */
или пустые строки - так что должна быть только одна строка на файл - общее количество которых grep
возвращается вам. Если вы хотите включить также дочерние каталоги, сделайте следующее:
ls -aR1qp ./ | grep -cv '^\.\{1,2\}/\|^$'
или...
ls -AR1q ./ | grep -cv '/\|^$'
Обратите внимание, что в последней версии -A
опция — POSIX.ls