package.jsonのjson値を使用してフォルダ名を一括変更します。

package.jsonのjson値を使用してフォルダ名を一括変更します。

これは少しクレイジーですが、可能かどうかを知りたいです。

たとえば、私のフォルダに300のフォルダがあり、/var/wwwすべて同じ名前に名前を変更できます。[Name](Num)kindred (19)

ほとんどすべてのフォルダにはという名前のファイルがあり、package.jsonすべてのファイルにはnameプロジェクト名を含むキーと値のペアがあります。

{
  "name": "a useful project name",
   ......
  "main": "src/index.js",
}

package.json含まれているフォルダの名前をファイル内の「名前」の値に変更したいと思いますpackage.json

ベストアンサー1

jsonファイルを解析する必要があるときに使用できるより良いツールの1つは次のとおりです。jq。これにより、ディレクトリ内のファイルnameからフィールドを簡単に抽出できます。package.json名前の変更は簡単なシェルスクリプトです。

$ cd /var/www
$ for d in */; do  # *1
>    if [ -f "${d}package.json" ]; then  # *2
>        new_name=$(jq -e -M -r .name "${d}package.json")  # *3
>        if [ $? -eq 0 ] && ! [ -e "${new_name}" ]; then  # *4
>            mv "${d}" "${new_name}"  # *5
>        fi
>    fi
> done

いくつかの注意:

* 1:*/現在のディレクトリの下のすべてのディレクトリに展開されます。すべてのディレクトリ名の末尾に1つがあるため、/* 2と* 3の後には1つを追加しません。

* 2:package.jsonファイルのあるディレクトリのみが処理されます。

* 3:jqから名前フィールドを抽出するには呼び出しますpackage.json。 with を呼び出しjq-r生の文字列を出力し(つまり、二重引用符を省略)、カラー出力が-Mなく、フィールドが-eない場合はエラーで終了します。jqname

* 4:jq実行が成功した(nameフィールドがある)ディレクトリの新しい名前がまだ存在しないことを確認してください。else名前の変更をスキップする両方の場合、エラーメッセージを出力するために分離して追加する必要があるかもしれません。

*5: ディレクトリ名を変更します。

echoテスト実行のためにコマンドの前に* 5を入れ、mv名前の変更が正しいことを確認してください。ファイルを含むディレクトリがあまりないため、直接テストしませんでしたpackage.json

おすすめ記事