수정된 날짜를 기준으로 파일을 정렬한 다음 이름을 기준으로 정렬합니다.

수정된 날짜를 기준으로 파일을 정렬한 다음 이름을 기준으로 정렬합니다.

다양한 카메라의 이미지가 포함된 디렉토리를 가정해 보겠습니다.

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

명령의 각 부분에 대한 설명:

  1. TIME_STYLE 형식의 날짜 열입니다 ls -l. 이 예에서는 Unix epoch 스타일 출력을 사용합니다.+%s
  2. sort -k6,6n -k7. 기본 알파벳 순서 방법을 사용하여 숫자를 기준으로 6열을 기준으로 출력을 정렬한 ls -l다음 7열을 기준으로 정렬합니다.
  3. awk '{print $7}'. 열 7만 표시됩니다. 이는 6열을 표시하려는 경우에 필요합니다 awk '{print $6 $7}'.

이것은문서 정렬그리고파일 타임스탬프 문서.

관련 정보