有没有办法从命令输出中找出行数?

有没有办法从命令输出中找出行数?

我正在尝试比较两个服务器之间的命令输出。我想从诸如 之类的命令的输出中找出行数ls -l。有办法这样做吗?到目前为止我还没有发现任何东西。

答案1

对于某些人来说,这可能更容易记住:

ls -l | grep . -c

请注意 grep 和 wc 都会计算辅助行,例如total 32044or 或./dirname:。为了避免这种情况,特别是在递归输出中,请ls -lR尝试以下操作:

find . -type f | grep . -c

其中第一个.是目录路径,-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当前目录下的文件,根据需要使用 shell glob 来替换不可打印的字符。grep过滤掉任何父目录列表或..空白*/行 - 因此每个文件应该只有一行 -grep返回给您的总计数。如果您还希望包含子目录,请执行以下操作:

ls -aR1qp ./ | grep -cv '^\.\{1,2\}/\|^$'

或者...

ls -AR1q ./ | grep -cv '/\|^$'

请注意,最新版本中的-A选项是 POSIX。ls

相关内容