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 .