Effacer un repertoire dans un dossier et ses sous-dossiers

Effacer un repertoire dans un dossier et ses sous-dossiers - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 02-09-2011 à 14:24:46    

Bonjour,
 
 
Voici mon problème :
 
J'ai un dossier  qui contient plein de sous-dossiers qui contiennent des sous-dossier, etc.
L'ensemble est sous contrôle de version  avec SVN.
 
J'ai besoin d'envoyer l'ensemble, seulement j'aimerais éviter de fournir tous les dossiers '.svn' présent.
 
 
Existe-il un moyen de chercher et d'effacer tous ces répertoires?
 
J'ai essayé :
 

Code :
  1. find * .svn -type d -exe rm -rf {} \;


 
mais je me suis aperçu qu'il effacer des fichiers qui n'étais pas présent dans les répertoires ".svn".
 
 
Merci pour vos réponses.


Message édité par le fou le 02-09-2011 à 14:24:58

---------------
Celui qui sauve une vie, sauve l'humanité (Le Talmud) - Personne n'a plus grand amour que celui de donner sa vie pour ses amis (Jean XV, 13)
Reply

Marsh Posté le 02-09-2011 à 14:24:46   

Reply

Marsh Posté le 02-09-2011 à 15:07:50    

Tu filtres mal :

Citation :

-wholename pattern
       File name matches shell pattern pattern. The metacharacters  do
       not treat '/' or '.' specially; so, for example,
   find . -wholename './sr*sc'
       will  print an entry for a directory called './src/misc' (if one
       exists). To ignore a whole directory tree,  use -prune rather
       than  checking every file in the tree.  For example, to skip the
       directory 'src/emacs' and all files and  directories  under  it,
       and  print the names of the other files found, do something like
       this:
   find . -wholename './src/emacs' -prune -o -print


Message édité par o'gure le 02-09-2011 à 15:09:17
Reply

Marsh Posté le 02-09-2011 à 15:20:34    

J'ai essayé (en m'inspirant de l'exemple) :
 

Code :
  1. find . -wholename './.svn' -o -print


 
Mais il m'affiche toujours des fichiers et des dossiers qui ne sont pas dans un dossier parent .svn pou qui ne contiennent même pas le motif svn


---------------
Celui qui sauve une vie, sauve l'humanité (Le Talmud) - Personne n'a plus grand amour que celui de donner sa vie pour ses amis (Jean XV, 13)
Reply

Marsh Posté le 02-09-2011 à 17:04:34    

Avec plein de pipes on doit pouvoir s'en sortir.

Code :
  1. find . -type d |grep \.svn |xargs rm -r


(En l'executant sans le dernier pipe au moins pour contrôler avant de tout casser :o).


---------------
Si tu bois froid juste après le potage chaud, ça va faire sauter l'émail de tes dents - Monorailcat iz ohverin
Reply

Marsh Posté le 02-09-2011 à 17:45:27    

[ oggy@nemed ~/wdir/test ]
> tree -a
.
├── 1
│   ├── A
│   ├── B
│   ├── C
│   └── .svn
│       ├── a
│       ├── b
│       └── c
├── 2
│   ├── A
│   ├── B
│   ├── C
│   └── .svn
│       ├── a
│       ├── b
│       └── c
├── 3
│   ├── A
│   ├── B
│   ├── C
│   └── .svn
│       ├── a
│       ├── b
│       └── c
├── A
├── B
├── C
└── .svn
    ├── a
    ├── b
    └── c

 

7 directories, 24 files
[ oggy@nemed ~/wdir/test ]
> find . -type d -name .svn
./2/.svn
./.svn
./1/.svn
./3/.svn
[ oggy@nemed ~/wdir/test ]
> find . -type d -name .svn -exec rm -rf {} \;
find: "./2/.svn": Aucun fichier ou dossier de ce type
find: "./.svn": Aucun fichier ou dossier de ce type
find: "./1/.svn": Aucun fichier ou dossier de ce type
find: "./3/.svn": Aucun fichier ou dossier de ce type
zsh: exit 1     find . -type d -name .svn -exec rm -rf {} \;
[ oggy@nemed ~/wdir/test ]
> tree -a
.
├── 1
│   ├── A
│   ├── B
│   └── C
├── 2
│   ├── A
│   ├── B
│   └── C
├── 3
│   ├── A
│   ├── B
│   └── C
├── A
├── B
└── C

 

3 directories, 12 files


Je trouve bizare le coup du "aucun fichier/dossier de ce type, mais ça fonctionne
a, b, c et A, B, C étant des fichiers


Message édité par o'gure le 02-09-2011 à 17:47:00
Reply

Marsh Posté le 03-09-2011 à 12:33:55    

Le message est dû je pense au fait que find construit son arborescence de dossiers avant de parcourir, et le \; fait executer les commandes au fur et à mesure du parcours, donc quand il veut parcourir 2/.svn, ce dossier n'existe plus puisque supprimé juste avant. (je sais pas si je suis bien clair :D)
 
D'ailleurs, si tu utilises la syntaxe \+ (construction d'une seule commande à executer, qui l'est donc à la fin du parcours, alors que le \; va évaluer au fur et à mesure que ça matche) plus de messages d'erreurs :
 find . -type d -name .svn -exec rm -rf {} \+


---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
Reply

Marsh Posté le 03-09-2011 à 12:43:14    

Pour être plus clair :D
Dans le cas de find.... -exec command {} \; :
1) Dossier en cours de traitement <= repertoire courant (.)
2) Construction de la liste des répertoires dans le dossier en cours de traitement (.svn 1 2 3)
3) Est-ce l'un de ces dossiers matche ".svn" => oui => execution de la commande demandée sur .svn (qui en l'occurence est un rm et va donc le supprimer, mais ça find ne le sait pas, on lui donne une commande externe, il l'execute...)
4) parcours des fils : pour dossier dans (.svn 1 2 3) : dossier courant <= dossier ; GOTO 2)
=> .svn n'existe pas !

 

Alors qu'avec le \+ la commande n'est exécuté qu'après le parcours complet de l'arborescence donc pas d'interférence avec l'algo de find [:cerveau dr]


Message édité par e_esprit le 03-09-2011 à 12:43:53

---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
Reply

Marsh Posté le 03-09-2011 à 15:02:25    

svn export <source> <destination>

Reply

Marsh Posté le 03-09-2011 à 23:13:47    

Merci à tous pour vos réponses. Ca peut toujours être utile de connaître ce genre d'options.
 
Et merci à BloodyCarnage, qui a trouvé une réponse beaucoup plus simple. Si j'avais su que SVN le faisait tout seul.....ca m'apprendra a regarde mieux la doc.
 
 
PS: petite question subsidiaire, j'ai essayé la commande find, seulement ca bloque avec les répertoires contenant des espaces.


---------------
Celui qui sauve une vie, sauve l'humanité (Le Talmud) - Personne n'a plus grand amour que celui de donner sa vie pour ses amis (Jean XV, 13)
Reply

Marsh Posté le 04-09-2011 à 10:58:31    

Les espaces dans les noms de répertoires/fichiers c'est le mal :o
Surtout pour du code source :D


---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
Reply

Marsh Posté le 04-09-2011 à 10:58:31   

Reply

Marsh Posté le 05-09-2011 à 10:10:52    

Il est vrai.  
Pour ma défense, ce n'est pas moi qui est choisit l'arborescence.
 
Donc, dans cette hypothése, comment indiquer à 'find', ou plutot à 'rm' de prendre en compte les espaces?


---------------
Celui qui sauve une vie, sauve l'humanité (Le Talmud) - Personne n'a plus grand amour que celui de donner sa vie pour ses amis (Jean XV, 13)
Reply

Marsh Posté le 05-09-2011 à 10:20:58    

Généralement je pipe dans xargs
Sinon regarde la section  UNUSUAL FILENAMES du man find (-ls notamment)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed