![在 bash 中:过滤、按名称中的日期排序,并返回最近日期的名称](https://linux22.com/image/157948/%E5%9C%A8%20bash%20%E4%B8%AD%EF%BC%9A%E8%BF%87%E6%BB%A4%E3%80%81%E6%8C%89%E5%90%8D%E7%A7%B0%E4%B8%AD%E7%9A%84%E6%97%A5%E6%9C%9F%E6%8E%92%E5%BA%8F%EF%BC%8C%E5%B9%B6%E8%BF%94%E5%9B%9E%E6%9C%80%E8%BF%91%E6%97%A5%E6%9C%9F%E7%9A%84%E5%90%8D%E7%A7%B0.png)
在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 限定符的 globoe'<code>'
:o
根据对e
的评估对列表进行排序code
(其中代码将$REPLY
变量设置为排序的基础)${(s:.:Oa)REPLY}
:在点上s
分割$REPLY
变量(包含要考虑的文件名),并O
通过a
数组索引反转顺序(反转列表)${(j::)list}
:加入列表的元素。因此,如果$REPLY
最初是,则 glob 将排序的InStockDaily10.07.19.csv
新值是。$REPLY
csv1907InStockDaily10
假设前缀始终与您的示例中的相同。如果没有,您可以使用:
list=(*.csv(oe'<REPLY=${(j::)${(Oas:.:M)REPLY%??.??.??.*}}>'))
%pattern
与参数扩展标志结合使用,M
从M
的末尾提取附加模式的后缀$REPLY
(因此$REPLY
将csv190710
代替csv1907InStockDaily10
)。