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필드 구분 기호로 사용하여 .세 번째 필드 연도, 두 번째 필드 월, 날짜가 있는 첫 번째 필드별로 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

관련 정보