递归搜索文件内容并按修改日期排序显示

递归搜索文件内容并按修改日期排序显示

我正在尝试设置满足以下所有条件的文件搜索:

  1. 在包含通配符的目录中递归搜索(例如:/home/user/level_1/*/level_3/*/level_5/ ...应该在“level_5”及其所有子目录中搜索)
  2. 搜索文件的内容(例如:“文件中的文本”)
  3. 定义要搜索的文件名(例如:script.js)(可能可以与#1 结合使用?)
  4. 显示带有搜索字符串的路径和上下文的结果(例如/home/user/level_1/level_2/level_3/level_4/level_5/script.js Here is the text in file...确切的格式可以不同,但​​应包含此信息。时间戳不是必需的。如果它不显示完整路径,而是仅显示所表示的目录,那将是一个额外的好处bylevel_2在上面的示例中,但这不是必需的。)
  5. 显示按文件修改日期排序的结果,从最旧到最新。

我下面有这个命令,它满足 1-4 的要求。

grep -r --include=\script.js "text in file" /home/user/level_1/*/level_3/*/level_5/

有什么想法可以包括第五个吗?我已经看到了使用 zsh 完成类似事情的各种解释,find但我无法将它们放在一起。

答案1

既然您正在使用zsh,那么它应该只是一个问题:

grep -H 'text in file' /home/user/level_1/*/level_3/*/level_5/**/script.js(.Om)

**/在匹配任何级别的子目录时,.限定符限制为常规的文件(如 GNUgrep对 所做的那样-r),Om O并按修改时间反向排序m(如ls -rt)。D如果您还想查找隐藏的限定符(如 GNUgrep的做法),请添加限定符-r

-H(一种 GNU 扩展,如-r--include)确保即使 只找到一个文件,也会打印文件名zsh

要打印二级目录除了文件路径之外,仍然使用 GNU grep,您可以执行以下操作:

for f (/home/user/level_1/*/level_3/*/level_5/**/script.js(N.Om))
  grep -H --label=${f:h5:t} 'text in file' < $f

哪里:h5需要5h电子头组件(/home/user/level_1/level_2in )/home/user/level_1/level_2/and/more...,以及:tt艾尔其中(level_2)。

要包含时间戳,您可以使用 zsh 的stat内置函数来检索它:

zmodload zsh/stat
for f (/home/user/level_1/*/level_3/*/level_5/**/script.js(N.Om)) {
  stat -LF%FT%T.%3.%z -A t +mtime $f
  grep -H --label="${f:h5:t} ($t)" 'text in file' < $f
}

这里的时间戳以毫秒精度的标准明确格式格式化,例如 2022-12-01T09:30:00.895+0000,但您可以根据自己的喜好调整格式-F(使用strftime()格式)。

相关内容