多数のXMLファイルの再フォーマット


11

ネストされたディレクトリ構造全体に散在する多数のXMLファイルを操作しています。

私は以下を試しました:

$ find . -name "*.xml" -type f | xargs -- xmllint --format

問題は、フォーマットされたXML出力を画面に生成しますが、ファイルを変更しないことです。

このコマンドを変更して、実際のファイルの内容を変更するにはどうすればよいですか?

回答:


23

これはfind直接使用して行うことができます-exec

find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;

渡されたもの-execは、テンプレートパラメータ{}が現在のファイル名に置き換えられて見つかったファイルごとに1回呼び出されます。\;findコマンドの終わりには、単に回線を終端。

同じ呼び出し内で入力ファイル名と出力ファイル名の両方xargsを指定する必要があるためxmllint、ファイルごとに1回呼び出す必要があるため、この場合はの使用は実際には必要ありません。

xargsfindからパイプされたコマンドが一度に複数のファイルを処理していて、そのリストが長い場合に必要になります。この場合、単一のファイル名をの--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


@manatwork編集ありがとう-スティッキーフィンガー; o)
ディスター

私はこれを実行しました、そしてそれは御馳走を働かせているようです!迅速で簡潔な回答に感謝します!
Harry

2
「ファイルリストが大きすぎる場合、これは失敗します」:いいえ、失敗しません(一度に1つのファイルを処理します)。実際、これfind … -execは最も直接的な方法です。
Gilles 'SO-悪をやめる

@ギレスグッドポイント!私はそれに応じて私の答えを更新しました。
2012年

1
これは、xmllint最初に完全なxmlドキュメントをメモリにロードしてから、解析/書き込みを行うために機能します。これにより、ドキュメントのインプレース処理が可能になります。
ジヴェンコア2018年

6

私は通常、これらの問題を間接層で攻撃します。あなたが望むことをするシェルスクリプトを書いて、それを呼んでください。まずはお勧めします

#! /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

これは、将来さらに複雑な操作を行う必要がある場合に適したアプローチのようです。ご回答ありがとうございます。
Harry
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.