2017-09-07 2 views
0

J'essaie d'écrire un script pour séparer un dépôt GitHub avec de nombreux projets dans des dépôts séparés tout en conservant leur historique git. Je sais comment tout faire à la main, mais je voulais gagner du temps en écrivant un script pour le faire pour moi.Exclusion de dossiers dans la boucle bash

Voici ce que j'ai jusqu'à présent

Script

#!/bin/bash 
REPO_DIR="C:/Users/Jerred/GitKraken/harding-computer-science/" 

cd "$REPO_DIR" 

for X in "`find . -maxdepth 2 -mindepth 2 -type d`" 
do 
    if [[ "$X" == *"git"* ]]; then 
     echo "NO MATCH: $X" 
     continue; 
    fi 
    echo "$X" 
done 

Cela fonctionne assez bien, sauf qu'il comprend le dossier .git qui devrait être exclu. Pour une raison quelconque, cela ne fonctionne pas.

Sortie

NO MATCH: ./.git/hooks // This is ignored like I want 
./.git/info    // This isn't ignored but it should be 
./.git/logs 
./.git/objects 
./.git/refs 
./COMP 151 - Programming II/Lab 10 Resources 
./COMP 151 - Programming II/Lab 11 Resources 

Je doute qu'il est nécessaire, mais voici le repo sur GitHub.

+1

Il ne répond pas à votre question mais avez-vous envisagé d'utiliser l'option '-path' de' find' pour filtrer '.git/*'? Essayez d'ajouter '! -path ./. git/\ * 'à votre commande find, peut-être. –

Répondre

3

Vos guillemets autour de la commande find transforment sa sortie en une seule chaîne (avec de nouvelles lignes). Vous bouclez sur une seule valeur X qui correspond à *"git"*. Ainsi, vous imprimez NO MATCH: suivi de la chaîne complète (avec ses nouvelles lignes). Preuve: ajoutez echo foobar au début de votre boucle et voyez qu'elle n'est imprimée qu'une seule fois.

Vous pouvez essayer:

find . -maxdepth 2 -mindepth 2 -type d ! -path ./.git/\* 

qui devrait faire ce que vous voulez (sans les NO MATCH sorties).

+0

Cela fonctionne. Je n'ai pas réalisé que les guillemets autour de la commande find l'ont fait sortir une chaîne, mais c'est logique maintenant. –