다양한 카메라의 이미지가 포함된 디렉토리를 가정해 보겠습니다.
DCIM1234.JPG
DCIM1235.JPG
DCIM1236.JPG
DSCN4120.JPG
DSCN4121.JPG
DSCN4122.JPG
DSCN4123.JPG
IMG5840.JPG
IMG5841.JPG
IMG5842.JPG
IMG5843.JPG
개별 카메라에 대한 이러한 모든 파일은 를 사용하여 수정 날짜별로 쉽게 정렬할 수 있습니다 ls -t
. 문제는 대부분의 파일 시스템의 정밀도가 1초 이상이므로 연속 촬영 시와 같이 일부 사진의 타임스탬프가 동일할 수 있다는 것입니다. 이 경우 ls -t
파일의 자연스러운 순서가 손실되어 이름에 반영될 수 있습니다.
수정 시간별로 파일을 정렬하는 동시에 수정 시간이 동일한 파일을 이름별로 정렬하는 방법은 무엇입니까?
답변1
ls
일반적으로 출력을 구문 분석하지 않는 것이 좋습니다 . 위의 didal24에서 제안한 것처럼 stat
더 나은 옵션입니다.
$ stat -c "%Y/%n" *.JPG | sort -t/ -k1,1n -k2 | sed 's@^.*/@@'
에서 man stat
:
파일의 유효한 형식 순서(--file-system 제외):
...
%n filename
%Y 마지막 데이터 수정 시간, 에포크 이후 초
따라서 stat -c "%Y/%n" *.JPG
초 단위의 타임스탬프와 로 시작하는 각 파일의 이름이 제공됩니다 /
.
1580845717/IMG5841.JPG
이 명령의 출력은 로 파이프되어 sort -t/ -k1,1n -k2
첫 번째 열을 기준으로 정렬한 다음 숫자(타임스탬프), 두 번째 열을 기준으로 정렬합니다. 열은 /
( )로 구분됩니다 -t/
.
마지막으로 명령의 출력이 sort
로 파이프되어 sed
첫 번째 문자(선택한 구분 기호)까지 모든 문자를 제거합니다. /
결과는 원하는 순서(마지막에 나열된 "최신" 파일)로 파일 이름 목록에 나타납니다.
답변2
sort
형식화된 날짜 출력과 결합된 이 명령을 참조하세요 ls
. 다음과 같은 것이 좋은 출발점이 될 것입니다.
TIME_STYLE=+%s ls -l | sort -k6,6n -k7 | awk '{print $7}'
ls -l
이 출력을 바탕으로:
-rw-rw-r--. 1 ajc ajc 669 1626129161 commit-types.txt
-rw-r--r-- 1 ajc ajc 3578 1638037524 emacsintro.org
-rw-r--r-- 1 ajc ajc 170 1646399639 README.md
명령의 각 부분에 대한 설명:
- TIME_STYLE 형식의 날짜 열입니다
ls -l
. 이 예에서는 Unix epoch 스타일 출력을 사용합니다.+%s
sort -k6,6n -k7
. 기본 알파벳 순서 방법을 사용하여 숫자를 기준으로 6열을 기준으로 출력을 정렬한ls -l
다음 7열을 기준으로 정렬합니다.awk '{print $7}'
. 열 7만 표시됩니다. 이는 6열을 표시하려는 경우에 필요합니다awk '{print $6 $7}'
.
이것은문서 정렬그리고파일 타임스탬프 문서.