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
フィールド区切り記号として、.
3 番目のフィールド年、2 番目のフィールド月、日付を持つ最初のフィールドでInStockDailyXX
ソートtail -n 1
最後の行(最新の日付)を取得する
答え2
ではzsh
、次のようにソートされたリストを取得できます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
分割し、配列インデックスに基づいて順序を逆にします(リストを反転)。 :リストの要素を結合します。したがって、最初にglobの新しい値は。$REPLY
O
a
${(j::)list}
$REPLY
InStockDaily10.07.19.csv
$REPLY
csv1907InStockDaily10
プレフィックスは常にあなたの例と同じであると仮定します。それ以外の場合は、次のものを使用できます。
list=(*.csv(oe'<REPLY=${(j::)${(Oas:.:M)REPLY%??.??.??.*}}>'))
%pattern
引数拡張フラグと一緒に使用すると、追加されたパターンのサフィックスが末尾M
から抽出されます(したがって置き換えられます)。M
$REPLY
$REPLY
csv190710
csv1907InStockDaily10