ネストされたディレクトリ構造全体に散在する多数の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
を使用 。