我有一段如下代码,我需要找到下面提到的模式的最新修改日期文件。
array=( ($find /path -type f \(-name "REF_DATA*" -0 -name "REF_CUST*" \) -printf %f\n' ))
/path 目录中可以存在多个日期的文件。我如何在 find 命令或通过 ls -ltr 中实现相同的目的?
答案1
使用zsh
shell,你将能够构造一个简短的 shell 模式来查找/path
名称与模式匹配的最近修改的常规文件REF_DATA*
:
/path/**/REF_DATA*(.NDom[1])
在此 shell 通配模式中,**
匹配到任何级别的子目录。末尾的括号是一个通配限定符,用于修改前面的通配模式的行为。在这种情况下,点使其仅匹配常规文件,即不匹配目录或其他文件类型。和N
与在 shell中启用和shell 选项D
具有相同的效果;如果它不匹配任何内容,它就会删除该模式,并且使该模式分别与隐藏名称匹配。nullglob
dotglob
bash
最后一个om
按[1]
修改时间戳对文件进行排序,并返回排序集中的第一个条目,即最近修改的文件。
您想要最近修改的文件与REF_DATA*
或匹配REF_CUST*
,然后使用
/path/**/REF_(DATA|CUST)*(.NDom[1])
因此,例如,您可以将此模式与某些实用程序一起使用,例如
printf '%s\n' /path/**/REF_(DATA|CUST)*(.NDom[1])
要仅获取路径名的文件名部分,请添加:t
到通配符的末尾。
从非zsh
shell 中,您可能会使用以下方式调用它
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)
)