Сценарий оболочки для объединения файлов с одинаковыми именами

У меня есть каталог файлов, таких как:

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 

Как я могу объединить первое имя 7digit с тем же именем в новый файл в том же каталоге или в подкаталоге, он должен выглядеть следующим образом:

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

Существует множество инструментов для объединения файлов PDF, один из которых – pdfunite . Простой однострочный инструмент для работы с этим инструментом выглядит следующим образом:

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

Я использую здесь механизм расширения параметров ${file%_*} чтобы удалить шаблон суффикса _* из совпадающего имени файла и создать ${file%_*}.pdf в качестве выходного файла.

Вот краткий пример, использующий команду «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 

Теперь мы можем перебрать все файлы, соответствующие вашей структуре имен. Затем поместите их в соответствующий подкаталог. Затем мы используем команду «convert» для объединения этих 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 в подкаталоге – это ваш объединенный файл.