Eu tenho um grupo de arquivos json. Cada arquivo contém um objeto json e todos eles têm o mesmo esquema. Existe um campo no json para o qual quero renomear o arquivo. Como eu posso fazer isso?
Eu cheguei a esta solução:
find . -name '*.json' | xargs -i mv {} $(cat {} | jq '.billingAccountList[0]' | tr -d \").json
Mas não funciona, pois cat
está tentando interpretar o {}. Eu esperava que os xargs o interpretassem. Dá-me este erro:
cat: {}: No such file or directory
Use um loop para manipular os arquivos um por um.
Por exemplo, com
while read
:O uso
for
pode ser possível, mas é mais sensível a espaços nos nomes dos arquivos:Observe também que você está movendo os arquivos para o diretório atual , pois o caminho original está sendo removido, portanto, se você deseja manter a estrutura do diretório:
ATUALIZAÇÃO : Usando
jq -r
como sugerido por @steeldriver. Obrigado!Você deve ser capaz de usar
jq -r
para produzir strings brutas (sem aspas) - em vez de retirar aspas comtr
Também vou assumir que você deseja renomear os arquivos em relação ao diretório pai (portanto, por exemplo, se o valor
.billingAccountList[0]
empath/to/file.json
éfoo
, o novo nome deve serpath/to/foo.json
em vez defoo.json
), e que sua implementação defind
tem um-execdir
Então eu faria algo como
ou (pelo menos com GNU
find
) de forma mais eficienteRemova o
echo
quando estiver satisfeito de que está fazendo a coisa certa.Com
zsh
'szmv
(para melhor tratamento de conflitos):(retire
-n
quando estiver feliz).