これは少しクレイジーですが、可能かどうかを知りたいです。
たとえば、私のフォルダに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
ない場合はエラーで終了します。jq
name
* 4:jq
実行が成功した(name
フィールドがある)ディレクトリの新しい名前がまだ存在しないことを確認してください。else
名前の変更をスキップする両方の場合、エラーメッセージを出力するために分離して追加する必要があるかもしれません。
*5: ディレクトリ名を変更します。
echo
テスト実行のためにコマンドの前に* 5を入れ、mv
名前の変更が正しいことを確認してください。ファイルを含むディレクトリがあまりないため、直接テストしませんでしたpackage.json
。