查找具有多种模式的最新日期的文件

查找具有多种模式的最新日期的文件

我有一段如下代码,我需要找到下面提到的模式的最新修改日期文件。

array=( ($find /path -type f \(-name "REF_DATA*" -0 -name "REF_CUST*" \) -printf %f\n' ))

/path 目录中可以存在多个日期的文件。我如何在 find 命令或通过 ls -ltr 中实现相同的目的?

答案1

使用zshshell,你将能够构造一个简短的 shell 模式来查找/path名称与模式匹配的最近修改的常规文件REF_DATA*

/path/**/REF_DATA*(.NDom[1])

在此 shell 通配模式中,**匹配到任何级别的子目录。末尾的括号是一个通配限定符,用于修改前面的通配模式的行为。在这种情况下,点使其仅匹配常规文件,即不匹配目录或其他文件类型。和N与在 shell中启用和shell 选项D具有相同的效果;如果它不匹配任何内容,它就会删除该模式,并且使该模式分别与隐藏名称匹配。nullglobdotglobbash

最后一个om[1]修改时间戳对文件进行排序,并返回排序集中的第一个条目,即最近修改的文件。

您想要最近修改的文件与REF_DATA*或匹配REF_CUST*,然后使用

/path/**/REF_(DATA|CUST)*(.NDom[1])

因此,例如,您可以将此模式与某些实用程序一起使用,例如

printf '%s\n' /path/**/REF_(DATA|CUST)*(.NDom[1])

要仅获取路径名的文件名部分,请添加:t到通配符的末尾。

从非zshshell 中,您可能会使用以下方式调用它

zsh -c 'printf "%s\n" /path/**/REF_(DATA|CUST)*(.NDom[1]:t)'

或者,要将与任一模式匹配的两个文件分别放入数组中bash(如果存在两个文件,否则您将在数组中获得一个或零个条目),

array=(
    "$( zsh -c 'printf "%s\n" /path/**/REF_DATA*(.NDom[1]:t)' )"
    "$( zsh -c 'printf "%s\n" /path/**/REF_CUST*(.NDom[1]:t)' )"
)

请注意,如果文件名中存在这样的换行符,这可能会删除文件名中的尾随换行符(这不常见,但在技术上是可行的)。

如果你一开始就写信zsh,你显然不会打电话zsh -c而是直接打电话

array=(
    /path/**/REF_DATA*(.NDom[1]:t)
    /path/**/REF_CUST*(.NDom[1]:t)
)

答案2

统计数据在Linux中,你可以这样做:

find ... -exec stat -f "%Y %N" {} + |sort -rn|head -1|cut -f2

macOS 统计,参数的定义不同,这变成:

find ... -exec stat -f "%m%t%N" {} + |sort -rn|head -1|cut -f2

这个想法是返回文件名列表及其最后修改时间(以纪元秒为单位);按时间降序对列表进行排序,并从列表中截取最近修改的对象的名称。

在这两种情况下,带有嵌入空格的文件名都是通过在纪元秒和文件名之间使用制表符分隔符来处理的。

相关内容