Ich bearbeite eine große Anzahl von XML-Dateien, die über eine verschachtelte Verzeichnisstruktur verstreut sind.
Folgendes habe ich versucht:
$ find . -name "*.xml" -type f | xargs -- xmllint --format
Das Problem besteht darin, dass die formatierte XML-Ausgabe auf dem Bildschirm generiert wird, die Datei jedoch nicht geändert wird.
Wie kann ich diesen Befehl so ändern, dass der eigentliche Dateiinhalt geändert wird?
Akzeptierte Antwort:
Dies kann über find
erfolgen direkt mit -exec
:
find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;
Was an -exec
übergeben wird wird einmal pro Datei aufgerufen, die mit den Vorlagenparametern {}
gefunden wird durch den aktuellen Dateinamen ersetzt. Der \;
am Ende des Find-Befehls beendet nur die Zeile.
Die Verwendung von xargs
ist in diesem Fall nicht wirklich notwendig, da wir xmllint
aufrufen müssen einmal pro Datei, da sowohl die Eingabe- als auch die Ausgabedateinamen innerhalb desselben Aufrufs angegeben werden müssen.
xargs
erforderlich, wenn der Befehl, zu dem von find geleitet wird, an mehreren Dateien gleichzeitig arbeitet und diese Liste lang ist. Das ist in diesem Fall nicht möglich, da Sie den einzelnen Dateinamen an --output
übergeben müssen Option von xmllint
. Ohne xargs
Sie könnten mit dem Fehler „Argument List too long“ enden, wenn Sie viele Dateien verarbeiten. xargs
unterstützt auch Dateiersetzungszeichenfolgen mit dem -I
Möglichkeit:
find . -name "*.xml" -type f | xargs -I'{}' xmllint --output '{}' --format '{}'
Würde dasselbe tun wie find -exec
Befehl oben. Wenn einer Ihrer Ordner ungerade Zeichen in gleichen Leerzeichen enthält, müssen Sie den -0
verwenden Optionen von find
und xargs
. Aber mit xargs
mit -I
impliziert die Option -L 1
was bedeutet, dass sowieso nur 1 Datei gleichzeitig verarbeitet wird, also können Sie auch direkt find
verwenden mit -exec
.