lote renomear pastas com valor do valor json em package.json

1

Este é um pouco louco, mas eu estou querendo saber se é mesmo possível.

Eu tenho talvez 300 pastas na minha pasta /var/www que foram todas renomeadas para o mesmo nome [Name](Num) so kindred (19) por exemplo.

Quase todas as pastas têm um arquivo chamado package.json , que tem um par de valores de chave name , que tem o nome do projeto ao lado.

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

Eu gostaria que a pasta que contém o package.json seja renomeada para qualquer que seja o valor de "name" dentro do arquivo package.json .

    
por Jamie Hutber 26.08.2018 / 13:51

1 resposta

1

Uma das melhores ferramentas para usar quando você precisa analisar arquivos json é jq . Isso facilita a extração do campo name do arquivo package.json em um diretório. Realizar a renomeação é um simples script de shell:

$ 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

Algumas notas:

* 1: */ se expande para todos os diretórios no diretório atual. Cada nome de diretório incluirá / no final, portanto, não colocaremos um depois em * 2 e * 3.

* 2: Processe apenas diretórios que tenham um arquivo package.json .

* 3: invoque jq para extrair o campo de nome de package.json . Invocamos jq com -r para gerar sequências de caracteres brutas (ou seja, deixar as aspas duplas), com -M para não ter saída colorida e -e para ter jq sair com um erro se não houver% camponame.

* 4: Verifique se jq foi executado com sucesso (havia um campo name ) e se o novo nome do diretório ainda não existe. Você pode querer dividi-las e adicionar um else se quiser enviar uma mensagem de erro para os dois casos em que você está pulando a renomeação.

* 5: renomeie o diretório.

Para uma execução de teste, coloquei echo na frente do comando mv em * 5 e verifiquei a saída para ver se a renomeação parece correta. Eu não testei isso sozinho, já que não tenho muitos diretórios com package.json files.

    
por 26.08.2018 / 14:26