Merge pdf files with numerical sort

bash, linux, numeric, pdf, sorting

Solution

you can embed the result of command using `$()`, so you can do following

$ pdfunite $(ls -v *.pdf) output.pdf

or

$ pdfunite $(ls *.pdf | sort -n) output.pdf

However, note that this does not work when filename contains special character such as whitespace.

In the case you can do the following:

ls -v *.pdf | bash -c 'IFS=$'"'"'\n'"'"' read -d "" -ra x;pdfunite "${x[@]}" output.pdf'

Although it seems a little bit complicated, its just combination of

- Read tab-separated file line into array

- build argument lists containing whitespace

- How to escape single quotes within single quoted strings

Note that you cannot use `xargs` since `pdfunite` requires input pdf's as the middle of arguments. I avoided using `readarray` since it is not supported in older bash version, but you can use it instead of `IFS=.. read -ra ..` if you have newer `bash`.

Problem

I am trying to write a bash script to merge all pdf files of a directory into one single pdf file. The command `pdfunite *.pdf output.pdf` successfully achieves this but it merges the input documents in a regular order: ``` 1.pdf 10.pdf 11.pdf 2.pdf 3.pdf 4.pdf 5.pdf 6.pdf 7.pdf 8.pdf 9.pdf ``` while I'd like the documents to be merged in a numerical order: ``` 1.pdf 2.pdf 3.pdf 4.pdf 5.pdf 6.pdf 7.pdf 8.pdf 9.pdf 10.pdf 11.pdf ``` I guess a command mixing `ls -v` or `sort -n` and `pdfunite` would do the trick but I don't know how to combine them. Any idea on how I could merge pdf files with a numerical sort?

Original source

Related problems