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

Основываясь на комментариях, я понимаю, что вы хотите отбросить (или где-то сохранить) первый аргумент, а затем использовать остальные аргументы в качестве аргументов для другого сценария или команды, из которой вы вызываете в вашем сценарии.

Если это так, вы можете сделать это довольно легко, и вам не нужно устанавливать переменную ( FLAGS или что-то еще) для передачи параметров сценария команде в вашем сценарии. См. Следующий пример:

#!/bin/bash
set -x

original_first_arg="$1"     # Use this line if you need to save the value to use later.

shift
mycommand "$@"

Команда shift является встроенной командой bash . Сам по себе (без указания номера) он просто отбрасывает первый аргумент скрипта (позиционный параметр). Из справочной страницы:

   shift [n]
          The  positional  parameters  from n+1 ... are renamed to $1 ....
          Parameters represented by the numbers  $#  down  to  $#-n+1  are
          unset.   n  must  be a non-negative number less than or equal to
          $#.  If n is 0, no parameters are changed.  If n is  not  given,
          it  is assumed to be 1.  If n is greater than $#, the positional
          parameters are not changed.  The return status is  greater  than
          zero if n is greater than $# or less than zero; otherwise 0.

Затем «$ @» расширяется до точных параметров, которые вы указали скрипту, за вычетом первого $ 1 , поскольку он был отброшен сдвигом команда.

Дополнительная литература:

1
26.08.2018, 14:51
1 ответ

Одним из лучших инструментов для анализа файлов 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для вывода необработанных строк (, т.е. оставляем двойные кавычки ), с -M, чтобы не иметь цветного вывода, и -e, чтобы jqзавершался с ошибкой, если поля nameнет.

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

*5 :Переименуйте каталог.

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

1
27.01.2020, 23:42

Теги

Похожие вопросы