Abaixo está a saída do comando curl (informações do arquivo sobre o branch), precisa de script ou comando para imprimir o nome do arquivo, tipo de arquivo e tamanho.
Eu tentei com, jq
mas consegui buscar um valor único ( jq '.values[].size'
)
{
"path": {
"components": [],
"name": "",
"toString": ""
},
"revision": "master",
"children": {
"size": 5,
"limit": 500,
"isLastPage": true,
"values": [
{
"path": {
"components": [
".gitignore"
],
"parent": "",
"name": ".gitignore",
"extension": "gitignore",
"toString": ".gitignore"
},
"contentId": "c9e472ef4e603480cdd85012b01bd5f4eddc86c6",
"type": "FILE",
"size": 224
},
{
"path": {
"components": [
"Jenkinsfile"
],
"parent": "",
"name": "Jenkinsfile",
"toString": "Jenkinsfile"
},
"contentId": "e878a88eed6b19b2eb0852c39bfd290151b865a4",
"type": "FILE",
"size": 1396
},
{
"path": {
"components": [
"README.md"
],
"parent": "",
"name": "README.md",
"extension": "md",
"toString": "README.md"
},
"contentId": "05782ad495bfe11e00a77c30ea3ce17c7fa39606",
"type": "FILE",
"size": 237
},
{
"path": {
"components": [
"pom.xml"
],
"parent": "",
"name": "pom.xml",
"extension": "xml",
"toString": "pom.xml"
},
"contentId": "9cd4887f8fc8c2ecc69ca08508b0f5d7b019dafd",
"type": "FILE",
"size": 2548
},
{
"path": {
"components": [
"src"
],
"parent": "",
"name": "src",
"toString": "src"
},
"node": "395c71003030308d1e4148b7786e9f331c269bdf",
"type": "DIRECTORY"
}
],
"start": 0
}
}
a saída esperada deve ser algo como abaixo
.gitignore FILE 224
Jenkinsfile FILE 1396
Para o caso de uso fornecido na pergunta, a resposta de @JigglyNaga provavelmente é melhor do que isso, mas para algumas tarefas mais complicadas, você também pode percorrer os itens da lista usando
keys
:de
file
:ou da string:
Então, por exemplo, você pode usar:
se você não tiver novas linhas para os valores, poderá fazê-lo com uma única
jq
chamada dentro do loop, o que o torna muito mais rápido:Extraindo os membros
.children.values[]
gera cada membro da matriz.values
.|
canaliza o resultado anterior através do próximo filtro, como um shell pipe[
...,
...,
...]
faz com que todos os termos dentro apareçam em uma única matriz-c
opção produz formato "compacto" ou seja. um objeto por linhaResultado:
Formatando o resultado
Se você deseja gerar uma tabela bem alinhada, essa é uma tarefa melhor tratada por outras ferramentas, como
column
oupaste
.-t
dizcolumn
para adivinhar o número de colunas com base na entrada-s...
especifica o(s) caractere(s) delimitador(es)Resultado:
Isso depende dos caracteres
[
,]
,,
e"
não aparecendo em seus nomes de arquivos, o que não é uma suposição segura.paste
também pode organizar várias entradas lado a lado. Para isso, podemos remover completamente as estruturas JSON e gerar linhas brutas (dica de chapéu para @muru):paste - - -
significa 3 colunas, todas lidas da mesma fonte. Desta vez, a única suposição é que os nomes dos arquivos não contenham novas linhas.jq
pode renderizar sua saída em vários formatos: consulte https://stedolan.github.io/jq/manual/#FormatstringsandescapingPara saída separada por tabulação:
Solução com
ramda-cli
:Primeiro percorremos a lista de valores, depois mapeamos a lista
flat
para converter cada entrada que é uma estrutura de objeto profunda em uma estrutura superficial, com chaves separadas por pontos.Então, podemos mapear a lista novamente e escolher as propriedades desejadas com base em seus caminhos, representados por strings.
Por fim,
-o tsv
cuida da conversão da lista de listas resultante para o formato tsv.Para depurar ou entender melhor o que está acontecendo, você pode verificar o que cada argumento faz removendo-os um por um do final do comando e observando a diferença na saída em cada etapa. Eles são simplesmente operações (ou funções) aplicadas nos dados, um de cada vez, da esquerda para a direita.
uma solução de liner baseada em
jtc
e xargs:Nota: há uma irregularidade json em seu arquivo (a chave de tamanho não está presente em todos os registros), para excluí-la o primeiro argumento
-x
é construído dessa forma (processe apenas os registros em que o tamanho está presente).