jsonファイルセットがあります。各ファイルにはjsonオブジェクトが含まれており、すべて同じスキーマを持ちます。ファイル名をjsonのフィールドに変更したいと思います。どうすればいいですか?
私はこの解決策を思い出しました。
find . -name '*.json' | xargs -i mv {} $(cat {} | jq '.billingAccountList[0]' | tr -d \").json
cat
しかし、{}を解釈しようとしているのでうまくいきません。 xargsが説明できることを願っています。私には、次のエラーが発生します。
cat: {}: No such file or directory
ベストアンサー1
ループを使用してファイルを1つずつ処理します。
たとえば、次のようになりますwhile read
。
find . -name '*.json' | while read fname; do
newname=$(jq -r '.billingAccountList[0]' "${fname}").json
mv "${fname}" "${newname}"
done
可能ですが、次のようにfor
ファイル名のスペースに敏感です。
for fname in $(find . -name '*.json'); do
... (same as above) ...
また、ファイルを次の場所に移動することに注意してください。現在の元のパスが削除されたため、ディレクトリ構造を維持するには、次の手順を実行します。
find . -name '*.json' | while read fname; do
fdir=$(dirname "${fname}")
newname=$(jq -r '.billingAccountList[0]' "${fname}").json
mv "${fname}" "${fdir}/${newname}"
done
修正するjq -r
:@steeldriverが提案したように使用されます。ありがとうございます!