Слияние 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]. Исправлено в приведенных выше командах.