2010-01-25 2 views
3

Comment utiliser l'utilitaire find unix pour trouver toutes les copies de travail sur la machine? Par exemple, je peux utiliser la commande find/-name .svn -type d, mais elle affiche tous les résultats redondants (beaucoup de sous-dossiers), alors que je n'ai besoin que du répertoire parent de la copie de travail pour être affiché.trouver toutes les copies de travail subversion sur la machine

Il est question connexe, mais il ne permet pas vraiment dans mon cas: How can I find the root folder of a given subversion working copy

+0

Appartient sur http://superuser.com – bzlm

+5

Je dirais que cette programmation __IS__ liée, au moins dans une certaine mesure, @bzlm aussi, je priés de bien vouloir lire ceci: http: //meta.stackexchange .com/questions/4128/change-the-appartient-on-serverfault-tag-quand-une-question-est-déplacé-vers-serverfault/4211 # 4211 Veuillez ne pas retageler avec la balise belongs-on-xxx – Kimvais

+1

@bzim Les commentaires sont OK pour exprimer une opinion - les balises ne le sont pas. S'il vous plaît ne pas utiliser des balises comme "appartient-sur-super-utilisateur", en particulier ne remplacent pas tous les tags d'origine avec une telle étiquette - voir http://meta.stackexchange.com/questions/36819/too-many-questions-are- étant-fermé-comme-non-lié à la programmation/36821 # 36821 –

Répondre

5

peut-être quelque chose comme ça?

#!/bin/bash 
if [ -d "$1/.svn" ]; then 
     echo $1 
else 
     for d in $1/* 
     do 
       if [ -d "$d" ]; then 
         ($0 $d) 
       fi; 
     done 
fi; 

nom, par exemple - find_svn.sh, rendre exécutable et appeler comme ./find_svn.sh /var/www (peut nécessiter quelques ajustements pour normaliser le nom du répertoire (s), slash strip .. mais fonctionne pour moi dans ce formulaire , lorsqu'il est appelé sur un dir sans slash).

6

Mise à jour 3 - sortie triée de trouver pour assurer svn VIENT fichiers avant cachés. peut encore échouer pour les répertoires cachés enregistrés.


Perl peut supprimer les chemins imbriqués pour vous:

find -s . -ipath *.svn | perl -lne's!/\.svn$!!i;$a&&/^$a/||print$a=$_' 

Chez l'homme, cela dit: pour chaque chemin svn, en ignorant la partie /.svn, si le chemin actuel est un enfant du dernier chemin J'ai imprimé, ne l'imprimez pas.

exemple: la structure du répertoire:

$ find . 
. 
./1 
./1/.svn 
./1/1 
./1/1/.svn 
./2 
./2/.svn 
./3 

on obtient

./1 
./2 
+0

non. ça ne marche pas comme supposé. les répertoires enfants sont toujours affichés – altern

+0

pouvez-vous s'il vous plaît me donner un exemple d'entrée qui ne fonctionne pas correctement? –

+0

Brown @ Alex: Je suis la liste des dossiers à la suite ./REL_1.0/archive/pubupdate ./REL_1.0/archive ./REL_1.0/meta ./REL_1.0/backend ./REL_1.0/doc ./REL_1.0/src ./REL_1.0 alors que le dossier REL_1.0 est le dépôt svn parent – altern

1

si vous avez GNU find/trier

find /path -type f -name ".svn*" -printf "%h\n" | sort -u 
1

Les œuvres suivantes pour moi très bien. Il trouve également toutes les extractions clairsemées (ou les copies de travail imbriquées).

find $PWD -type d -wholename "*/.svn" | 
while read path 
do 
    path=${path%%/.svn} 
    wcr=$(svn info ${path} 2>/dev/null | perl -F"/:\s/" -le '{ print $F[1] if $F[0] =~ /^Working Copy Root/; }') 
    [ "$path" = "$wcr" ] && { 
     echo -e "\n WC Root $path"; svn stat -qu $path; 
     } 
done 
Questions connexes