如何列出 中文件的行数/group/book/four/word
(按它们包含的行数排序)?
该ls -l
命令列出文件但不对它们进行排序。
答案1
你应该使用这样的命令:
find /group/book/four/word/ -type f -exec wc -l {} + | sort -rn
find
:在你想要的路径上搜索文件。如果您不希望它递归,并且您的find
实现支持它,则应该在选项-maxdepth 1
之前添加-exec
。exec
:告诉命令wc -l
在每个文件上执行。sort -rn
:按相反顺序对结果进行数字排序。从大到低。
(假设文件名不包含换行符)。
答案2
非递归
如果您不需要递归性,可能是最简单的版本:
wc -l /group/book/four/word/*|sort -n
wc
计算下-l
每个(但隐藏)( *
) 文件中的行数(选项) /group/book/four/word/
,并对sort
结果进行数字排序(通过管道|
)(选项-n
)。
递归
有人对此答案发表了评论grep -rlc
,之前提到过,以压制它。 Indeedgrep
是一个很好的选择,特别是如果您需要递归性:
grep -rc '^' /group/book/four/word/|tr ':' ' '|sort -n -k2
将递归地计算目录中与 ( ) (即行开头)匹配的-c
(选项) 行。然后,您必须用空格替换冒号,例如使用, 来 help ,您要在第二列(选项)上对它进行数字排序(选项)。-r
grep
'^'
/group/book/four/word/
tr
sort
-n
-k2
更新 :请参阅 Stephane 关于可能的限制以及如何真正摆脱tr
.
答案3
和zsh
:
lines() REPLY=$(wc -l < $REPLY)
print -rC1 /group/book/four/word/*(.no+lines)
我们定义一个新的排序函数lines
返回文件中的行数。我们使用o+lines
glob 限定符,它与n
(用于数字排序)一起定义 glob 结果的排序方式。 (.
还添加了仅检查常规文件)。
.
除了忽略隐藏文件(以 开头的文件)之外,这不会假设文件名可能包含哪些字符。D
如果您也需要,请添加glob 限定符。
当你经常做类似的事情时,定义一个lines
函数很有用,但如果是一次性的,你也可以一次性完成:
print -rC1 /group/book/four/word/*(.noe['REPLY=$(wc -l < $REPLY)'])
从另一个 shell 中,只需运行:
zsh -c '
print -rC1 /group/book/four/word/*(.noe['\''REPLY=$(wc -l < $REPLY)'\''])'
或者如果您确实必须使用这些 shell,则将其存储在ksh93
/数组中:bash
typeset -a array
eval "
array=(
$(
zsh -c '
() {
print -r -- "${(qq)@}"
} /group/book/four/word/*(N.noe['\''REPLY=$(wc -l < $REPLY)'\''])'
)
)
"
(这里使用正确的单引号(带有qq
参数扩展标志)以使eval
评估安全)。
答案4
如果你想安装fd
一个用 Rust 编写的非常快速的文件查找器(你应该安装它,无论如何它都很棒)
fd --type=file . | xargs wc -l | sort -n
基本上fd
列出了文件, xargs 将文件列表传递给wc
(代表字数统计,但传递 -l 将使其计算行数),然后最后从最少的行数到最大的使用sort -n
.