我正在尝试比较两个服务器之间的命令输出。我想从诸如 之类的命令的输出中找出行数ls -l
。有办法这样做吗?到目前为止我还没有发现任何东西。
答案1
对于某些人来说,这可能更容易记住:
ls -l | grep . -c
请注意 grep 和 wc 都会计算辅助行,例如total 32044
or 或./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