列出文件,按其包含的行数排序

列出文件,按其包含的行数排序

如何列出 中文件的行数/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 ,您要在第二列(选项)上对它进行数字排序(选项)。-rgrep'^'/group/book/four/word/trsort-n-k2

更新 :请参阅 Stephane 关于可能的限制以及如何真正摆脱tr.

答案3

zsh

lines() REPLY=$(wc -l < $REPLY)
print -rC1 /group/book/four/word/*(.no+lines)

我们定义一个新的排序函数lines返回文件中的行数。我们使用o+linesglob 限定符,它与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.

相关内容