在 bash 中:过滤、按名称中的日期排序,并返回最近日期的名称

在 bash 中:过滤、按名称中的日期排序,并返回最近日期的名称

在bash中,我想将文件名列表过滤为仅.csv,根据日期顺序排序(名称中的日期,而不是时间戳),然后根据名称中的日期顺序返回最新的文件名:

[root@server test2]# curl -l "ftp.fakeurl.com.au/In Stock Daily CSV/"  --user username:password
InStockDaily01.07.19.csv
InStockDaily01.07.19.xls
InStockDaily02.07.19.csv
InStockDaily02.07.19.xls
InStockDaily03.06.19.csv
InStockDaily03.06.19.xls
InStockDaily03.07.19.csv
InStockDaily03.07.19.xls
InStockDaily04.06.19.csv
InStockDaily04.06.19.xls
InStockDaily04.07.19.csv
InStockDaily04.07.19.xls
InStockDaily05.06.19.csv
InStockDaily05.06.19.xls
InStockDaily05.07.19.csv
InStockDaily05.07.19.xls
InStockDaily06.06.19.csv
InStockDaily06.06.19.xls
InStockDaily07.06.19.csv
InStockDaily07.06.19.xls
InStockDaily08.07.19.csv
InStockDaily08.07.19.xlsx
InStockDaily09.07.19.csv
InStockDaily09.07.19.xls
InStockDaily10.07.19.csv
InStockDaily10.07.19.xls
InStockDaily11.06.19.csv

答案1

尝试这个:

curl -l "ftp.fakeurl.com.au/In Stock Daily CSV/"  --user username:password |
  grep '\.csv$' |
  sort -t. -k3,3 -k2,2 -k1,1 |
  tail -n 1
  • grep '\.csv$'获取 csv 行
  • sort -t. -k3,3 -k2,2 -k1,1使用.as 字段分隔符按第三个字段年份、第二个字段月份和第一个字段InStockDailyXX与日期进行排序
  • tail -n 1获取最后一行(最新日期)

答案2

在 中zsh,您可以通过以下方式获取 s 的排序列表csv

list=(*.csv(oe'<REPLY=${(j::)${(s:.:Oa)REPLY}}>'))

然后最新的一个就在$list[-1]

  • *.csv(glob-qualifier): 带有 glob 限定符的 glob
  • oe'<code>'o根据对e的评估对列表进行排序code(其中代码将$REPLY变量设置为排序的基础)
  • ${(s:.:Oa)REPLY}:在点上s分割$REPLY变量(包含要考虑的文件名),并O通过a数组索引反转顺序(反转列表) ${(j::)list}:加入列表的元素。因此,如果$REPLY最初是,则 glob 将排序的InStockDaily10.07.19.csv新值是。$REPLYcsv1907InStockDaily10

假设前缀始终与您的示例中的相同。如果没有,您可以使用:

list=(*.csv(oe'<REPLY=${(j::)${(Oas:.:M)REPLY%??.??.??.*}}>'))

%pattern与参数扩展标志结合使用,MM的末尾提取附加模式的后缀$REPLY(因此$REPLYcsv190710代替csv1907InStockDaily10)。

相关内容