모든 일이 잘 되길 바랍니다.
다음과 같은 파일이 있습니다.
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
. 하지 마세요, 안 될 거예요..