获取最大月份年份的文件

获取最大月份年份的文件

我需要获取具有最大月份年份的文件。

我们的目录中有文件如下:

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

相关内容