파일 이름을 숫자순과 수정 시간순으로 정렬하는 방법은 무엇입니까?

파일 이름을 숫자순과 수정 시간순으로 정렬하는 방법은 무엇입니까?

pdfjoin/ /...를 통해 pdfunite스레드에 대한 답변에서 논의된 대로 PDF 파일을 숫자 순서로 결합하고 싶습니다 .PDF 파일을 병합하고 숫자로 정렬하는 Linux 명령그리고수정됨연대순으로. 스레드에서 솔루션을 사용하는 경우 숫자 및 알파벳순으로 순서가 정렬됩니다. 이는 파일 이름에 문제가 있습니다. 예를 들어 두 가지 모두 동일한 수정 시간 분 정밀도로 표시되지만 Visceral더 이른 정밀도로 표시됩니다(파일 브라우저는 이를 알아차리고 순서 Visceral대로 먼저 배치합니다 Modified).

Filename               Modified
-----                  ---
3.THE ABC.pdf          10:39 
3.Visceral abc..pdf    10:39

전체 파일 이름

1.Description abc.pdf
2.Gabcd.pdf
3.THE ABC.pdf
3.Visceral abc..pdf
4.description of abc.pdf
5.Chraa..pdf

제안 #1 숫자 및 알파벳 순서로 작업하되 숫자 및 수정된 순서는 사용하지 마세요.

# https://stackoverflow.com/a/23643544/54964
ls -v *.pdf | ...
    bash -c 'IFS=$'"'"'\n'"'"' read -d "" -ra x;pdfunite "${x[@]}" output.pdf'

제안 #2는 대소문자를 단순화하지만 파일 이름의 공백 및 기타 특수 문자를 처리하지 않습니다.

# https://stackoverflow.com/a/23643544/54964
pdfunite $(ls *.pdf | sort -n) output.pdf

명령에 대한 매뉴얼 페이지에는 pdfunite --help주문에 대한 내용이 없으므로 ls// sort... 을 통해 수행해야 한다고 생각했습니다.sortmodified

xhienne의 답변 테스트

표시된 출력의 순서가 올바르지 않으며 2.jpg어떤 4.jpg이유로 순서가 잘못되었습니다.

masi@masi:~/Documents$ ls -tr /home/masi/Documents/[0-9]* | sort -t. -k1,1n -s
/home/masi/Documents/1.jpg
/home/masi/Documents/3.jpg
/home/masi/Documents/5.jpg
/home/masi/Documents/6.jpg
/home/masi/Documents/7.jpg
/home/masi/Documents/8.jpg
/home/masi/Documents/9.jpg
/home/masi/Documents/10.jpg
/home/masi/Documents/2.jpg
/home/masi/Documents/4.jpg

두 번째 반복

export LC_ALL=C; ls -tr /home/masi/Documents/[0-9]* | sort -t. -k1,1n -s

산출

/home/masi/Documents/1.jpg
/home/masi/Documents/3.jpg
/home/masi/Documents/5.jpg
/home/masi/Documents/6.jpg
/home/masi/Documents/7.jpg
/home/masi/Documents/8.jpg
/home/masi/Documents/9.jpg
/home/masi/Documents/10.jpg
/home/masi/Documents/2.jpg
/home/masi/Documents/4.jpg

운영 체제: 데비안 8.5

답변1

당신은 이것을 할 수 있습니다 zsh:

zmodload zsh/stat

prefixmtime () {
sortstring=${(l:6::0:)${REPLY%%.*}}$(zstat -F '%s' +mtime -- $REPLY)
REPLY=${sortstring}
}

print -rl -- *(o+prefixmtime)

print -rl결과에 만족하면 명령으로 바꾸십시오.


작동 방식:
glob은 여기에서 정렬됩니다(다음을 통해).o+functionprefixmtime) 함수가 반환하는 내용 에 따라 sortstring왼쪽에 있는 각 파일 이름의 숫자 접두사를 연결하여 얻은 문자열입니다.${REPLY%%.*}패딩 처리된0 포함 (l:6::0:)(접두어 길이가 최대 6자라고 가정)그리고mtime단위(다음으로 획득)zstat기준 치수). 다음 명령을 실행하면 이것이 어떻게 작동하는지 이해하는 것이 더 쉬울 수 있습니다.

{ for f (*)
printf '%s %s\n' ${(l:6::0:)${f%%.*}}$(zstat -F '%s' +mtime -- $f) $f
} | sort -k1,1n

위의 내용은 파일과 동일한 디렉터리에 있다고 가정합니다. 그렇지 않으면 함수에서 정렬 문자열을 다음과 같이 정의해야 합니다.

sortstring=${(l:6::0:)${${REPLY##*/}%%.*}}$(zstat -F '%s' +mtime -- $REPLY)

그런 다음 디렉토리 경로를 사용할 수 있습니다.

print -rl some/place/else/*(o+prefixmtime)

답변2

find /home/masi/Documents -maxdepth 1 -type f -name '[0-9]*' -printf "%T+ %f\n" | sort -k2n -k1,1| cut -d ' ' -f 2- | xargs -i echo pdfunite /home/masi/Documents/{} output.pdf

파일 이름의 새 줄은 처리되지 않습니다.

-k1,1이를 변경하여 역순 정렬 순서를 전환할 수 있습니다 -k1,1r. 그러면 시간 정렬이 역순으로, -k2nr파일 이름 정렬이 역순으로 수행됩니다.

답변3

해결 방법은 먼저 수정 시간을 기준으로 정렬한 다음 첫 번째 숫자 필드(필드가 "."로 구분되어 있다고 가정)만 정렬하고 마지막 비교 방법(일명.안정적인 정렬).

ls -tr [0-9]* | sort -t. -k1,1n -s

[고쳐 쓰다]

파일 이름에 공백이 있는 것으로 나타나므로 다음을 사용하여 xargs실행 해야 합니다 pdfunite.

ls -tr [0-9]* | ( sort -t. -k1,1n -s; echo output.pdf ) | xargs pdfunite

관련 정보