Execute um comando em todos os arquivos em uma árvore de diretórios e coloque a saída em uma variável

1

Eu quero executar este comando bash:

#!/bin/bash
rep="*"

for f in 'ls -R'$rep; do
d='git log '$f'| wc -l'
c=$d
echo $c
done

como extrair um comando git log myFile | wc -l do bash?

ps: este comando retornará um número: git log myFile | wc -l

    
por user15992 10.10.2012 / 11:23

5 respostas

2

Se você quiser executar um comando e obter o resultado, use a linha abaixo

d='git log'

No seu script você tem que mudar duas coisas. Eu tenho o script correto abaixo

#!/bin/bash
rep="*"

for f in 'ls -R $rep'; do
d='git log $f| wc -l'
c=$d
echo $c
done

Editar: A correção original está mudando as cotações para backticks para fazer a saída atingir a variável d. Além disso, o $ rep deve estar dentro dos backticks com o ls, caso contrário, ele adicionará o * no final do último nome de arquivo processado.

    
por 10.10.2012 / 11:40
2

Já respondi à sua outra pergunta Sintaxe erro em um script bash que chama o find , então não vou repetir o que eu já escrevi em minha resposta lá .

Não analise a saída de ls . Você não precisa executar ls para enumerar arquivos em um diretório. Use find se precisar recorrer a subdiretórios.

Para obter a saída de wc -l , use-a em uma substituição de comando: $(git log "$f" | wc -l)

Note que você precisa de aspas duplas em torno do nome da variável. Sempre use aspas duplas em torno das substituições de comando e variável: "$foo" , "$(foo)" . Aspas duplas desligam o processamento adicional do shell do valor da variável ou saída do comando: sem aspas, o resultado é dividido em palavras que são interpretadas como padrões de coringa de arquivo. Com aspas simples, o sinal $ não é tratado especialmente, portanto, git veria $f em vez do valor.

find . -type f -exec sh -c '
  for x in "$@"; do
    c=$(git log "$f" | wc -l)
  done
' _ {} +

O uso de -exec … {} + em vez de -exec … {} \; permite que o shell intermediário seja invocado apenas uma vez por lote grande de arquivos, o que é um pouco mais rápido.

Desde bash ≥4, você não precisa usar find , você pode usar a sintaxe ** para recursar em subdiretórios.

shopt -s globstar
for x in **/*; do
  [ -f "$x" ] || continue  # skip directories and other non-regular files
  git log "$x" | wc -l
done
    
por 11.10.2012 / 02:45
1

Tanto quanto eu sei o comando:

     git log

Irá mostrar todos os históricos de revisão. Se isso for verdade, eu acho que você está tentando armazenar o conteúdo dentro de um arquivo chamado myfile e, em seguida, você deseja contar o número de linhas no arquivo.

Se é isso que você deseja, primeiro salve o histórico desta maneira:

     git log>myFile.txt

Agora você precisa encontrar o no de linhas usando wc -l e armazenar um arquivo chamado nOfLines.txt

Então você precisa fazer isso:

    wc -l<myFile.txt>nOfLines.txt

Em seguida, armazene o conteúdo desse arquivo dentro de uma variável chamada gitVar.

     gitVar=$(cat nOfLines.txt)

Você pode ver se isso está funcionando corretamente usando este comando:

     echo "$gitVar"

Apenas empacote a coisa toda dentro de um script chamado "myCommand.sh", dê a ela permssions usando chmod a + x e execute o script do terminal como um comando.

Espero que isso ajude você.

    
por 10.10.2012 / 12:00
0

Eu tenho uma solução, acho que com um comando eval : D

    
por 10.10.2012 / 11:40
-1

Eu acho que você quer fazer:

#!/bin/bash
rep="*"

for f in 'ls -R'$rep; do
d='git log "$f"| wc -l'
c=$d
echo $c
done

Observe as aspas duplas em vez das simples ao redor do comando git.

Uma solução menor poderia ser usar:

echo 'git log "$f"| wc -l'
    
por 10.10.2012 / 11:29