ファイルセットの名前を各ファイルの文字列に変更します。

ファイルセットの名前を各ファイルの文字列に変更します。

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が提案したように使用されます。ありがとうございます!

おすすめ記事