![如何在Linux终端中显示包含特定字符串的文件的排序列表](https://linux22.com/image/197874/%E5%A6%82%E4%BD%95%E5%9C%A8Linux%E7%BB%88%E7%AB%AF%E4%B8%AD%E6%98%BE%E7%A4%BA%E5%8C%85%E5%90%AB%E7%89%B9%E5%AE%9A%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E6%96%87%E4%BB%B6%E7%9A%84%E6%8E%92%E5%BA%8F%E5%88%97%E8%A1%A8.png)
假设我在不同的目录中有 3 个文件夹,其中一些包含更多子文件夹,并且在每个文件夹/子文件夹中我都有名为 、 等的文本文件test1
,test2
其中以某种方式test3
包含该字符串。hello
可以是正义hello
,也可以是helloJASKFNASKFN
等等。
如何显示这些文件的排序列表?假设我想按名称或修改日期排序。我确实知道我可以使用grep
orfind
命令来搜索和显示这些文件,但我不确定如何以排序的方式显示它们。
答案1
如果先对文件列表进行排序,然后再将其传递给grep
:
在 中zsh
,您可以执行以下操作:
grep -le hello -- **/test<->(.)
它在当前工作目录中或当前工作目录下查找名称后跟一个或多个十进制数字(是匹配数字范围的模式的一种形式)hello
的文件内容,跳过隐藏目录。test
<->
<x-y>
默认情况下,全局扩展按名称排序。
要按修改时间排序,请使用(.om)
代替(.)
。或(.oL)
按尺寸。请参阅 参考资料 中的 全局限定符列表 以及限定符可以排序的info zsh qualifiers
标准列表。o
替换o
为O
以反转顺序(On
按名称反向排序)。
用于(.n)
按数字名称排序(test10
在 后面test9
,而不是在test1
和之间test2
)。
如果你遇到一个争论太多execve()
错误(大多数系统的系统调用限制导致):
autoload -Uz zargs # best in ~/.zshrc
zargs -- **/test<->(.) -- grep -le hello --
使用 GNU 工具和任何 shell(除了 (t)csh 之外,您需要将命令放在一行上):
按名称排序:
LC_ALL=C find . -regextype posix-extended -name '.?*' -prune -o \
-regex '.*/test[0-9]+' -type f -print0 |
sort -z |
xargs -r0 grep -le hello --
(添加-V
选项以sort
进行数字排序)
按修改时间排序:
LC_ALL=C find . -regextype posix-extended -name '.?*' -prune -o \
-regex '.*/test[0-9]+' -type f -printf '%T@\t%p\0' |
sort -zrn |
cut -zf2- |
xargs -r0 grep -le hello --
添加/删除-r
以sort
颠倒顺序。