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 .