Sto manipolando un gran numero di file XML sparsi in una struttura di directory nidificata.
Ho provato quanto segue:
$ find . -name "*.xml" -type f | xargs -- xmllint --format
Il problema è che genera l'output XML formattato sullo schermo, ma non cambia il file.
Come posso modificare questo comando in modo che il contenuto effettivo del file venga modificato?
Risposta accettata:
Questo può essere fatto da find
utilizzando direttamente -exec
:
find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;
Cosa è passato a -exec
verrà invocato una volta per file trovato con i parametri del modello {}
sostituito con il nome del file corrente. Il \;
alla fine del comando find termina semplicemente la riga.
L'uso di xargs
non è realmente necessario in questo caso perché dobbiamo invocare xmllint
una volta per file poiché entrambi i nomi dei file di input e di output devono essere specificati all'interno della stessa chiamata.
xargs
sarebbe necessario se il comando inviato da find funzionava su più file alla volta e quell'elenco era lungo. Non puoi farlo in questo caso, poiché devi passare il singolo nome del file a --output
opzione di xmllint
. Senza xargs
potresti finire con un errore "Elenco argomenti troppo lungo" se stai elaborando molti file. xargs
supporta anche le stringhe di sostituzione dei file con -I
opzione:
find . -name "*.xml" -type f | xargs -I'{}' xmllint --output '{}' --format '{}'
Farebbe lo stesso di find -exec
comando sopra. Se una qualsiasi delle tue cartelle ha caratteri dispari in spazi simili dovrai usare -0
opzioni di find
e xargs
. Ma usando xargs
con -I
implica l'opzione -L 1
il che significa comunque elaborare solo 1 file alla volta, quindi puoi anche utilizzare direttamente find
con -exec
.