Слияние 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 бы с pdfunite, но я не знаю, как их объединить. Любая идея о том, как я мог бы объединить PDF файлы с числовой сортировкой?

Ответ 1

вы можете вставить результат команды с помощью $(), поэтому вы можете сделать следующее

$ 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'

Хотя это кажется немного сложным, его просто сочетание

Обратите внимание, что вы не можете использовать xargs, так как pdfunite требует ввода pdf в качестве середины аргументов. Я избегал использования readarray, поскольку он не поддерживается в старой версии bash, но вы можете использовать его вместо IFS=.. read -ra .., если у вас есть более новый bash.

Ответ 2

Сделайте это несколькими шагами. Я предполагаю, что у вас есть файлы от 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 и т.д., Иначе pdfunite перезапишет последний файл !!!

Изменить: К сожалению, в каждом регулярном выражении я отсутствовал [^ 0-9]. Исправлено в приведенных выше командах.