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フィールド区切り記号として、.3 番目のフィールド年、2 番目のフィールド月、日付を持つ最初のフィールドでInStockDailyXXソート
  • tail -n 1最後の行(最新の日付)を取得する

答え2

ではzsh、次のようにソートされたリストを取得できます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分割し、配列インデックスに基づいて順序を逆にします(リストを反転)。 :リストの要素を結合します。したがって、最初にglobの新しい値は。$REPLYOa${(j::)list}$REPLYInStockDaily10.07.19.csv$REPLYcsv1907InStockDaily10

プレフィックスは常にあなたの例と同じであると仮定します。それ以外の場合は、次のものを使用できます。

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

%pattern引数拡張フラグと一緒に使用すると、追加されたパターンのサフィックスが末尾Mから抽出されます(したがって置き換えられます)。M$REPLY$REPLYcsv190710csv1907InStockDaily10

関連情報