我需要获取具有最大月份年份的文件。
我们的目录中有文件如下:
Zmx_0416_control.txt
Zmx_0316_control.txt
现在,我需要从这些文件中获取该文件,Zmx_0416_control.txt
因为它属于 2016 年 4 月。
Zmx_0416_control.txt
我需要一个 Unix 命令来从文件列表中识别最大文件 ( )。
答案1
你可以使用sort
:
ls Zmx* | sort -k 1.7n -k 1.5,1.6n
或者
ls Zmx* | sort -t _ -k 2.3n -k 2,2.2n
并附有一个结论| tail -1
从 GNU 排序:
comparison
:“[...] 一对行的比较如下:sort 按照命令行上指定的顺序,根据关联的排序选项比较每对字段,直到发现差异或没有字段留下。 […]”
index-sort-field
另请参阅POSIX 排序。
答案2
不太优雅的解决方案:
将%m%y转换为100*y+m,例如:0416->1604,然后按数值进行比较。
for i in Z*
do
# convert %m%y to 100*y+m
current=$((100 * $(echo "$i"|cut -c 7-8) + $(echo "$i"|cut -c 5-6)))
if [[ $current > $max ]]; then
max=$current
maxstr=$i
fi
done
echo $maxstr
答案3
您可以使用两个变量来保存要比较的文件名和部分:
max=; f=; { for i in *.txt; do d="$(cut -d_ -f2 <<<"$i")"; \
d_s="$(sed 's/\(..\)\(..\)/\2\1/' <<<"$d")"; \
[ "$d_s" -gt "$max" ] && max="$d_s" && f="$i"; done ;} && echo "$f"
max
遍历文件名时包含当前最大值f
包含遍历时的文件名cut
取第二个字段,分隔符为_
sed
用于交换月份和年份进行比较
例子:
$ ls -1
foobar
Zmx_0316_control.txt
Zmx_0416_control.txt
Zmx_0716_control.txt
$ max=; f=; { for i in *.txt; do d="$(cut -d_ -f2 <<<"$i")"; d_s="$(sed 's/\(..\)\(..\)/\2\1/' <<<"$d")"; [ "$d_s" -gt "$max" ] && max="$d_s" && f="$i"; done ;} && echo "$f"
Zmx_0716_control.txt