回答:
これは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
。
find … -exec
は最も直接的な方法です。
xmllint
最初に完全なxmlドキュメントをメモリにロードしてから、解析/書き込みを行うために機能します。これにより、ドキュメントのインプレース処理が可能になります。
私は通常、これらの問題を間接層で攻撃します。あなたが望むことをするシェルスクリプトを書いて、それを呼んでください。まずはお勧めします
#! /bin/sh
for file
do
xmllint --format $file > $file.tmp && mv $file.tmp $file
done
ファイルを1つまたは2つ手動で試して、xargsで置き換えることができます。
find . -name "*.xml" -type f | xargs -- xmltidy.sh