2014-05-13 30 views
7

Sto provando a scrivere uno script bash per unire tutti i file pdf di una directory in un unico file pdf. Il comando pdfunite *.pdf output.pdf raggiunge con successo questo, ma si confonde i documenti di ingresso in un ordine regolare:comando linux unire file pdf con ordinamento numerico

1.pdf 10.pdf 11.pdf 2.pdf 3.pdf 4.pdf 5.pdf 6 .pdf 7.pdf 8.pdf 9.pdf

mentre mi piacerebbe i documenti da unire in un ordine numerico:

1.pdf 2.pdf 3.pdf 4.pdf 5.pdf 6.pdf 7.pdf 8.pdf 9.pdf 10.pdf 11.pdf

credo che un comando di miscelazione ls -v o sort -n e pdfunite farebbe il trucco ma non so come combinarli. Qualche idea su come potrei unire i file pdf con un ordinamento numerico?

La ringrazio molto per tutto l'aiuto

risposta

20

è possibile incorporare il risultato del comando usando $(), così si può fare seguendo

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

o

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

Tuttavia, nota che questo non funziona quando il nome del file contiene caratteri speciali come spazi bianchi.

Nel caso è possibile effettuare le seguenti operazioni:

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

Anche se sembra un po 'complicato, il suo solo combinazione di

Nota che non è possibile utilizzare xargs dal pdfunite richiede PDF di input come il centro degli argomenti. Ho evitato di utilizzare readarray poiché non è supportato nella versione precedente di bash, ma è possibile utilizzarlo al posto di IFS=.. read -ra .. se si dispone di un nuovo bash.

+0

Grazie mille! Confermo che la soluzione 1 e 2 funzionano ma non sono riuscito a far funzionare la soluzione 3 (xarg). Penso che pdfunite non stia riconoscendo gli input. Potresti spiegare la tua soluzione 3 in dettaglio? – max

+0

sorry 'xargs -I {}' può solo applicare gli argomenti uno per uno. dimenticalo, vorrei scrivere una nuova risposta. – ymonad

+0

Sì, quella risposta è in realtà un po 'sbagliata (la seconda stringa 'sh' è spazzatura), quindi ho aggiornato la risposta e scritto quella giusta – ymonad

0

Fatelo in più passaggi. Suppongo che tu abbia file da 1 a 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 

e così via.

il file finale sarà costituito da tutti i tuoi pdf in ordine numerico.

!!! Attenzione a scrivere il file di output come out1.pdf ecc. Altrimenti pdfunite sovrascriverà l'ultimo file !!!

Modifica: Spiacente mi mancava il [^ 0-9] in ogni espressione regolare. Correggendolo nei comandi sopra.

+0

grazie per il suggerimento ma non si ordina correttamente. Se unisci '1.pdf, 2.pdf, 11.pdf', l'ordine sarà' 11.pdf, 1.pdf, 2.pdf'. Cambiare 'sort' a' sort -n' non risolve il problema – max

+0

grazie e ho corretto la risposta. Inoltre, voglio dire che il comando sopra non è generico, ma copre la maggior parte dei file umani generati. – infoclogged

+0

grazie per questa correzione ma non funziona ancora. 'pdfunite $ (find ./ -regex". * [^ 0-9] [0-9] [^ 0-9]. * "| sort) out1.pdf' genera' out1.pdf' che include 1.pdf e 2. pdf (non 11.pdf) – max