usando find con exec e basename per eseguire un comando nella directory del file trovato


0

Ho un albero di directory che contiene i file MSDord .doc. Voglio convertirli tutti in .odt.

La sintassi è:

soffice --headless --convert-to odt -r --outdir <dir to place the .odt> *.doc

Sto cercando di usarlo findper farlo tutto in una volta. Ho provato a seguire:

find . -name "*.doc" -exec soffice --headless --outdir dirname {} --convert-to odt {} \;

e

find . -name "*.doc" -exec soffice --headless --outdir $("dirname '{}'") --convert-to odt {} \;

Ma entrambi falliscono. Come posso farlo?

Risposte:


1

Usa -execdirinvece. Eseguirà il comando nella stessa directory che contiene il file. I dettagli sono documentati in man find.

find . -name '*.doc' -exec soffice --headless --convert-to odt {} \;

Il tuo primo esempio non è riuscito, perché è dirnamestato interpretato come argomento per l'opzione exec. Il comando eseguito avrebbe dirnamecome argomento per --outdire avrebbe il percorso del file dopo di esso (come argomento posizionale)soffice --headless --outdir dirname <file> --convert-to odt <file>

Nel secondo esempio $("dirname '{}'")viene valutato dalla shell e l'output viene sostituito prima di eseguire find . Il risultato della sostituzione si svuoterebbe e "comando non trovato" verrebbe stampato in stderr . Il comando eseguito non avrebbe il parametro richiesto per --outdiraffattosoffice --headless --outdir --convert-to odt <file>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.