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

Ken*_*n R 38 shell bash files wc

如何列出 中文件/group/book/four/word的行数,按它们包含的行数排序?

ls -l 命令将它们列出来但不对它们进行排序

jhe*_*ran 43

你应该使用这样的命令:

find /group/book/four/word/ -type f -exec wc -l {} + | sort -rn
Run Code Online (Sandbox Code Playgroud)
  • find: 在您想要的路径上搜索文件。如果您不希望它递归,并且您的find实现支持它,则应该-maxdepth 1-exec选项之前添加。
  • exec: 告诉命令wc -l在每个文件上执行。
  • sort -rn: 以相反的顺序对结果进行数字排序。从大到小。

(假设文件名不包含换行符)。

  • “+”加号是什么意思? (2认同)

Ski*_*rou 15

非递归

如果您不需要递归,可能是最简单的版本:

wc -l /group/book/four/word/*|sort -n
Run Code Online (Sandbox Code Playgroud)

wc计算 下-l每个(但隐藏)( *) 文件中的行数(选项)/group/book/four/word/,并按数字sort对结果(通过管道|)进行排序(选项-n)。

递归

有人对这个答案发表了评论,提到grep -rlc, 之前要压制它。Indeedgrep是一个不错的选择,尤其是当您需要递归时:

grep -rc '^' /group/book/four/word/|tr ':' ' '|sort -n -k2
Run Code Online (Sandbox Code Playgroud)

-c递归地计算(选项)-r匹配(grep'^'(即行的开头)目录中的(选项)行/group/book/four/word/。然后,您必须用空格替换冒号,例如使用tr, 来帮助sort,您希望-n在第二列(选项-k2)上按数字排序(选项)。

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

  • `grep -c .` 计算包含至少一个有效字符的行数。使用 `grep -c '^'` 来计算所有的行数(也会使用一些 `grep` 实现来计算最后一个换行符之后的尾随字符)。请注意,并非所有 `grep` 实现都支持 `-r`,并且行为因支持而异。您不需要将 `:`s(冒号,而不是分号)转换为 `sort` 的空格。只需使用`-t:`。请注意,假设文件名不包含`:` 或空白或换行符。 (3认同)

Sté*_*las 8

zsh

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

我们定义了一个新的排序函数lines,它以文件中的行数进行回复。我们使用o+linesglob 限定符,它与n(用于数字排序)一起定义了 glob 的结果如何排序。(.也添加到仅检查常规文件)。

除了隐藏文件(以 开头的文件.)被省略之外,这不假设文件名可能包含哪些字符。D如果你想要它们,也可以添加glob 限定符。

lines当你经常做这样的事情时,定义一个函数很有用,但对于一次性的,你也可以一次性完成:

print -rC1 /group/book/four/word/*(.noe['REPLY=$(wc -l < $REPLY)'])
Run Code Online (Sandbox Code Playgroud)

在另一个 shell 中,只需运行:

zsh -c '
  print -rC1 /group/book/four/word/*(.noe['\''REPLY=$(wc -l < $REPLY)'\''])'
Run Code Online (Sandbox Code Playgroud)

或者,如果您确实必须使用这些 shell,则将其存储在ksh93/bash数组中:

typeset -a array
eval "
  array=(
    $(
      zsh -c '
        () {
          print -r -- "${(qq)@}"
        } /group/book/four/word/*(N.noe['\''REPLY=$(wc -l < $REPLY)'\''])'
    )
  )
"
Run Code Online (Sandbox Code Playgroud)

(此处使用正确的单引号引用(带有qq参数扩展标志)eval以确保安全)。

  • @l0b0 这并不意味着下一个需要它的人也将运行 bash。 (9认同)
  • OP 仅标记为“bash”... (2认同)