동일한 이름을 가진 파일을 병합하는 쉘 스크립트

동일한 이름을 가진 파일을 병합하는 쉘 스크립트

다음과 같은 파일 디렉토리가 있습니다.

file.1111111_1.pdf
file.1111111_2.pdf
file.2222222_1.pdf
file.2222222_2.pdf
file.1234567_1.pdf
file.1234567_2.pdf
file.aaaaaaa_1.pdf
file.aaaaaaa_2.pdf
file.abcdefg_1.pdf
file.abcdefg_2.pdf

동일한 파일 이름의 처음 7자리를 동일한 디렉터리나 하위 디렉터리의 새 파일에 병합하려면 어떻게 해야 합니까? 다음과 같이 끝나야 합니다.

file.1111111.pdf
file.2222222.pdf
file.1234567.pdf
file.aaaaaaa.pdf
file.abcdefg.pdf

답변1

PDF 파일을 병합하는 데는 여러 가지 도구가 있으며 그 중 하나는 입니다 pdfunite. 이 도구를 사용하여 필요한 작업을 수행하는 간단한 한 줄의 코드는 다음과 같습니다.

for file in file.*_*.pdf; do [[ -e ${file%_*}.pdf ]] && \
    continue || pdfunite ${file%_*}_*.pdf ${file%_*}.pdf; done

저는 여기서 사용해요매개변수 확장 메커니즘 ${file%_*}일치하는 파일 이름에서 접미사 패턴을 제거 하고 출력 파일로 _*만듭니다 .${file%_*}.pdf

답변2

다음은 "convert" 명령을 사용하는 간단한 예입니다.

$ ls
files.txt  TEST.pdf

TEST.pdf다음 웹사이트에서 얻은 Adobe PDF입니다여기. 이것은 나머지 파일 이름을 채우는 데 사용하는 예일 뿐입니다.

파일 이름은 다음과 같습니다.files.txt

$ cat files.txt 
file.1111111_1.pdf file.1111111_2.pdf file.2222222_1.pdf file.2222222_2.pdf file.1234567_1.pdf file.1234567_2.pdf file.aaaaaaa_1.pdf file.aaaaaaa_2.pdf file.abcdefg_1.pdf file.abcdefg_2.pdf

이 파일을 사용하여 테스트 데이터를 생성합니다.

$ for i in $(<files.txt); do cp TEST.pdf $i; done

$ ls
file.1111111_1.pdf  file.1234567_1.pdf  file.2222222_1.pdf  file.aaaaaaa_1.pdf  file.abcdefg_1.pdf  files.txt
file.1111111_2.pdf  file.1234567_2.pdf  file.2222222_2.pdf  file.aaaaaaa_2.pdf  file.abcdefg_2.pdf  TEST.pdf

이제 이름 구조와 일치하는 모든 파일을 반복할 수 있습니다. 그런 다음 적절한 하위 디렉터리에 넣습니다. 그런 다음 "변환" 명령을 사용하여 이러한 PDF를 단일 파일로 병합했습니다.

$ for pdf in $(ls *.*_*.pdf); do base=$(echo $pdf | cut -d_ -f1) ; \
    [[ -d $base ]] || mkdir $base ; mv $pdf $base/ ; \
    convert $base/*_*.pdf $base/$base.pdf ; done

$ ls
file.1111111  file.1234567  file.2222222  file.aaaaaaa  file.abcdefg  files.txt  TEST.pdf

$ ls file.1111111/ 
file.1111111_1.pdf  file.1111111_2.pdf  file.1111111.pdf

file.11111111.pdf하위 디렉터리에는 병합된 파일이 있습니다.

관련 정보