BASH: 이름별로 그룹화하고 마지막 이름 유지

BASH: 이름별로 그룹화하고 마지막 이름 유지

모든 일이 잘 되길 바랍니다.

다음과 같은 파일이 있습니다.

my_file_210804_2056_856.csv_20210804170806
my_file_210804_2056_856.csv_20211119181137
my_file_210805_2056_857.csv_20210805200847
my_file_210805_2056_857.csv_20211119181137
      ...

Unix 명령을 통해 파일의 마지막 버전을 검색하고 싶습니다.

예를 들어 파일의 경우210804난 그냥 되찾고 싶어my_file_210804_2056_856.csv_20211119181137이번이 마지막이니까.

당신의 도움을 주셔서 감사합니다

답변1

NUL 문자를 사용하여 파일 이름을 구분하려면 GNU 버전의 find, sort및 (를 사용하십시오. - NUL은head오직경로/파일 이름에 유효하지 않은 문자이므로 파일 이름 구분 기호로 안전하게 사용할 수 있는 유일한 문자입니다.

find . -maxdepth 1 -type f -name 'my_file_210804*' -print0 | sort -z -r | head -z -n 1

이는 포함된 문자(공백, 개행 등 포함)에 관계없이 모든 파일 이름에 적용됩니다.

파일 이름에 개행 문자가 없고 앞으로도 포함되지 않을 것이라고 확신하는 경우 개행 문자를 구분 기호로 사용할 수 있습니다. -print0명령에서 이를 제거 하고 find-z에서 sort옵션을 제거하십시오 head.

find . -maxdepth 1 -type f -name 'my_file_210804*' | sort -r | head -n 1

이 변형은 파일 이름이 일반 텍스트 파일(한 줄에 하나의 파일 이름)인 경우에도 유용합니다.

sort -r filename-list.txt | head -n 1

파일 이름에 포함된 날짜와 시간이 아닌 파일 시스템의 타임스탬프를 기준으로 파일 이름을 정렬하려는 경우 상황이 좀 더 복잡해집니다. 대신 :-printf​​%T@\t%p\0-print0

find . -maxdepth 1 -type f -name 'my_file_210804*' -printf '%T@\t%p\0' |
  sort -z -r -n -k 1,1 |
  cut -z -f2- |
  head -z -n 1

여기서는 출력을 정렬 sort ... -k1,1하는 데 사용됩니다 .find첫 번째필드(타임스탬프)를 제거한 다음 cut타임스탬프 필드와 이를 파일 이름과 구분하는 탭 문자를 제거하는 데 사용됩니다.


그런데, 당신은 구문 분석을 원할 수도 있습니다 ls. 하지 마세요, 안 될 거예요..

관련 정보