如何查找包含字符串的最新文件

如何查找包含字符串的最新文件

我有一个包含多个文件的目录。我只需要知道包含特定字符串的最新文件的完整路径。

这需要在 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 扩展,.仅限于常规文件。如果您需要这些文件的绝对路径,请添加。NN: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
}

相关内容