команда linux объединяет pdf-файлы с числовой сортировкой
Я пытаюсь написать сценарий bash, чтобы объединить все pdf-файлы каталога в один pdf-файл. Команда pdfunite *.pdf output.pdf
успешно достигает этого, но он объединяет входные документы в регулярном порядке:
1.документ pdf 10.документ pdf 11.документ pdf 2.документ pdf 3.документ pdf 4.документ pdf 5.документ pdf 6.документ pdf 7.документ pdf 8.документ pdf 9.формат PDF
в то время как я хотел бы, чтобы документы были объединены в числовом порядке:
1.документ pdf 2.документ pdf 3.документ pdf 4.документ pdf 5.документ pdf 6.документ pdf 7.документ pdf 8.документ pdf 9.документ pdf 10.документ pdf 11.формат PDF
Я думаю, что команда смешивание ls -v
или sort -n
и pdfunite
сделал бы трюк, но я не знаю, как их объединить.
Любая идея, как я могу объединить PDF файлы с числовой сортировки?
большое спасибо за любую помощь
2 ответов
вы можете встроить результат команды, используя $()
,
таким образом, вы можете сделать следующее
$ pdfunite $(ls -v *.pdf) output.pdf
или
$ pdfunite $(ls *.pdf | sort -n) output.pdf
обратите внимание, что это не работает, когда имя файла содержит специальные символы, такие как пробелы.
в этом случае вы можете сделать следующее:
ls -v *.txt | bash -c 'IFS=$'"'"'\n'"'"' read -d "" -ra x;pdfunite "${x[@]}" output.pdf'
хотя это кажется немного сложным, его просто сочетание
- Bash: читать разделенную вкладками строку файла в массив
- построить список аргументов с пробелами
- как избежать одинарных кавычек в одинарных строках?
обратите внимание, что вы не можете использовать xargs
С pdfunite
требует ввода pdf в качестве середины аргументов.
Я избегал использовать readarray
так как он не поддерживается в старой версии bash, но вы можете использовать его вместо IFS=.. read -ra ..
если у вас есть новый bash
.
сделать это в несколько шагов. Я предполагаю, что у вас есть файлы от 1 до 99.
pdfunite $(find ./ -regex ".*[^0-9][0-9][^0-9].*" | sort) out1.pdf
pdfunite out1.pdf $(find ./ -regex ".*[^0-9]1[0-9][^0-9].*" | sort) out2.pdf
pdfunite out2.pdf $(find ./ -regex ".*[^0-9]2[0-9][^0-9].*" | sort) out3.pdf
и так далее.
окончательный файл будет состоять из всех ваших PDF-файлов в числовом порядке.
!!! Остерегайтесь записи выходного файла, такого как out1.pdf etc. в противном случае pdfunite перезапишет последний файл !!!
изменить: Извините, что я пропустил [^0-9] в каждом регулярном выражении. Исправлено это в приведенных выше командах.