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
... 을 통해 수행해야 한다고 생각했습니다.sort
modified
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+function
prefixmtime
) 함수가 반환하는 내용 에 따라 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