script para fazer o cd em muitos diretórios e executar um comando

2

Estou tentando escrever um script que possa ser adicionado mais tarde. Basicamente, eu tenho uma coleção de git repos em todo o meu diretório pessoal. Eu gostaria de manter uma lista principal de seus locais e, em seguida, ter um script executado por todos eles e executar um comando git up ou git pull ou algo assim.

Estou cansado de ter cd em tudo individualmente para atualizá-lo. Eu gostaria de fazer tudo de uma vez, mas não há rima ou motivo para a localização deles, e prefiro não reestruturar minha árvore de pastas domésticas apenas para acomodar alguma ação de script.

Estou mais do que feliz em ter isso como um arquivo de configuração, onde posso simplesmente acrescentar mais diretórios ao início do arquivo, conforme necessário, ao longo do tempo.

EDITAR:

Aqui é onde eu estou:

CWD="$(pwd)";
cd ;
dir1="$HOME/FW/foo";
dir2="$HOME/FW/bar";


for repo in $dir1, $dir2;
do 
  cd "$repo"
  git up  
done
cd $CWD

Ah, e estou usando o ZSH, não o bash ...

    
por testname123 07.12.2016 / 17:55

2 respostas

2
#!/bin/bash
# This will attempt to do a 'git pull' in any directories found in the
# present working directory.

for d in *; do
    if [[ -d "$d"/.git ]]; then
        ( cd $d; git pull )
    fi
done
    
por 07.12.2016 / 17:59
0

Na verdade, você não precisa alterar o diretório para um repositório git para executar um comando com git . Você pode passar o diretório de trabalho para git com -C path .

Se você quiser manter uma lista de repositórios, sugiro usar uma matriz:

repos=(
$HOME/somedir/repo1
"$HOME/somedir/with space/repo2"
)

for repo in $repos; do
    git -C $repo $@
done

Se você colocar isso em um script, diga com o nome multigit , você pode executar qualquer comando git , pois os argumentos são passados com $@ . Por exemplo, multigit pull .

Se você não se importa em configurar uma lista de repositórios, você pode até obter zsh para encontrar todos eles para você:

for repo in **/.git(/N); do
    git -C ${repo:h} $@
done

**/.git(/N) pesquisará recursivamente por qualquer diretório chamado .git e ${repo:h} removerá o último elemento de um caminho, neste caso .git , deixando você com os caminhos para os repositórios.

Bônus: você pode até conseguir completar o Tab para o seu novo comando:

compdef '_dispatch git git' multigit
    
por 13.12.2016 / 12:27

Tags