我有一个日期文件列表如下......
filename_20120101.dat
filename_20120102.dat
filename_20120103.dat
我需要一个脚本,它根据文件名中的日期(而不是文件的日期戳)选择最新的文件。
答案1
zsh 强制回答:
echo "The highest-numbered file is" filename_*.dat([-1])
这是一个带有全局限定符 [NUM]
仅保留第 NUM 个匹配项(负值从最后一个匹配项开始计数)。如果您有不同宽度的数字,请将n
限定符添加到
% ls
filename_1.dat filename_12.dat filename_17.dat filename_2.dat filename_8.dat
% echo filename_*.dat([-1])
filename_8.dat
% echo filename_*.dat(n[-1])
filename_17.dat
通配仅发生在查找单词列表的上下文中,因此如果要将文件名分配给变量,则需要将其设置为包含一个元素的数组:
latest=( filename_*.dat([-1]) )
echo "The highest-numbered file is $latest"
在任何 shell 中,您都可以将位置参数设置为完整的匹配列表并保留最后一个。
set_latest () {
eval "latest=\${$#}"
}
set_latest filename_*.dat
echo "The highest-numbered file is $latest"
请记住,这将按字母顺序返回最后一个,而不是按数字顺序,例如filename_10.dat
is after filename_09.dat
but before filename_9.dat
。
答案2
ls(1)
按名称对文件进行排序,ls | tail -1
应该这样做。
答案3
1-班轮:
# for numerical order
find . -maxdepth 1 -name '*.dat' -print | sort -rV | head -n1
# for alphabetical order
find . -maxdepth 1 -name '*.dat' -print | sort -r | head -n1
注意:您可以使用ls
代替find
.
答案4
如果文件名完全是数字,则需要首先通过排序进行管道传输,因为 ls 会按字母顺序对文件进行排序,并且 10 将出现在 9 之前
$ touch {1..10)
$ ls | tail -1
> 9
$ ls | sort -n | tail -1
> 10