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