我有一个包含多个文件的目录。我只需要知道包含特定字符串的最新文件的完整路径。
这需要在 macOS 上运行,并且目录路径包含空格。
我需要能够调用这个 bash 命令,而不必先cd
进入该目录。
注意:我在这里看到了类似的问题,但它们只是检查目录中的最新文件是否包含该字符串。这意味着如果目录中第二个最近的文件包含我正在查找的字符串,它将失败。
我苦苦挣扎的部分原因是,当目录中有空格时,事情就会崩溃,并且弄清楚如何引用路径对于xargs
.使用find -exec
不起作用,因为没有find
标志可以按上次修改的顺序返回结果。
说明: 文件的内容需要包含字符串,而不是文件名。我希望使用 bash,因为这是其他 bash 脚本的一部分,并且我也很想了解如何在 bash 中执行此操作。
答案1
如果要在文件名中找到该字符串:
print -rC1 -- the/directory/**/*string*(Nom[1])
如果内容中有:
for f (the/directory/**/*(N.om)) grep -l -- string $f && break
(假设 zsh shell 应该是 macos 上的默认交互式 shell,而不是 bash,bash 在 macos 上是一个古老的版本,并且无论如何都没有 glob 限定符)。
这om
全局限定符 o
对于ullglob,按m
修改时间(从最新到最旧)排序 glob 扩展,.
仅限于常规文件。如果您需要这些文件的绝对路径,请添加。N
N
:P
请参阅info zsh qualifiers
(或同样在线获取最新版本的 zsh)了解详情。
在 bash、sh 或其他 shell 中,您始终可以执行以下操作:
zsh -c 'any of those codes above'
答案2
Mac OS 带来了zsh
,所以不需要find
任何复杂的东西。看吧man zshexpn
,差不多到最后了
# Usage:
# findnewest path string
#
function findnewest() {
## look recursively **; if you want only top-level files, remove the **/.
for file in $1/**/*(.Nom) ; # (om): order by modification date, youngest first
if grep -q -F -- "$2" "${file}" ; then
# you said you needed the full path:
realpath -- "${file}"
break
fi
done
}