ネストされたディレクトリ構造全体に散在する多数のXMLファイルを操作しています。
私は次のことを試しました:
$ find . -name "*.xml" -type f | xargs -- xmllint --format
問題は、フォーマットされたXML出力を画面に生成しますが、ファイルは変更しないことです。
このコマンドを変更して、実際のファイルの内容を変更するにはどうすればよいですか?
承認された回答:
これはfindから実行できます -execを直接使用する :
find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;
-execに渡されるもの テンプレートパラメータ{}で見つかったファイルごとに1回呼び出されます 現在のファイル名に置き換えられます。 \; findコマンドの最後で、行を終了するだけです。
xargsの使用 この場合、xmllintを呼び出す必要があるため、実際には必要ありません。 入力ファイル名と出力ファイル名の両方を同じ呼び出し内で指定する必要があるため、ファイルごとに1回。
xargs findからパイプされるコマンドが一度に複数のファイルで機能していて、そのリストが長い場合に必要になります。この場合、単一のファイル名を--outputに渡す必要があるため、これを行うことはできません。 xmllintのオプション 。 xargsなし 大量のファイルを処理している場合、「引数リストが長すぎます」というエラーが発生する可能性があります。 xargs -Iを使用したファイル置換文字列もサポートします オプション:
find . -name "*.xml" -type f | xargs -I'{}' xmllint --output '{}' --format '{}'
find -execと同じように動作します 上記のコマンド。フォルダのいずれかが同じスペースに奇数文字を持っている場合は、-0を使用する必要があります findのオプション およびxargs 。ただし、xargsを使用する -Iを使用 オプション-L 1を意味します これは、とにかく一度に1つのファイルのみを処理することを意味するため、findを直接使用することもできます。 -execを使用 。