Search code examples
linuxbashsortingpdfnumeric

Merge pdf files with numerical sort


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?


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

    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.