Пакетное переименование папок со значением из значения json в package.json

Это немного сумасшедший, но мне интересно, если это вообще возможно.

У меня может быть 300 папок в папке /var/www , которые все были переименованы в одно и то же имя [Name](Num) kindred (19) .

Почти в каждой из этих папок есть файл с именем package.json которого у всех есть пара name ключ-значение, которое затем содержит название проекта.

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

Мне бы хотелось, чтобы папка, содержащая package.json была переименована в любое значение «name» внутри файла package.json .

Одним из лучших инструментов для анализа файлов json является 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: */ распространяется на все каталоги в текущем каталоге. Каждое имя каталога будет содержать / в конце, поэтому мы не будем указывать его позже в * 2 и * 3.

* 2: Только каталоги процессов, которые имеют файл package.json .

* 3: jq для извлечения поля имени из package.json . Мы вызываем jq с -r для вывода необработанных строк (т. jq двойные кавычки), с -M чтобы не иметь цветного вывода, и -e чтобы jq с ошибкой, если поле name отсутствует.

* 4: Убедитесь, что jq успешно запущен (там было поле name ) и что новое имя для каталога еще не существует. Вы можете разделить их и добавить else если хотите вывести сообщение об ошибке для двух случаев, когда вы пропускаете переименование.

* 5: переименовать каталог.

Для пробного запуска я бы поставил echo перед командой mv в * 5 и проверил вывод, чтобы убедиться, что переименование выглядит правильно. Я не проверял это сам, так как у меня нет нескольких каталогов с файлами package.json .