Shell linux, commande find

Résolu/Fermé
chris79 Messages postés 91 Date d'inscription lundi 3 octobre 2005 Statut Membre Dernière intervention 1 février 2016 - 9 févr. 2010 à 20:25
chris79 Messages postés 91 Date d'inscription lundi 3 octobre 2005 Statut Membre Dernière intervention 1 février 2016 - 18 févr. 2010 à 16:40
Bonjour,

Je possède un répertoire "source" contenant plusieurs répertoires et plusieurs fichiers.
Je dois copier ce répertoire ailleurs dans "dest" à l'exception de
- certains sous-répertoires #cas 1
- certains fichiers #cas 2
- tout le contenu de certains sous-répertoires (en gros je garde le répertoire vide :-) #cas 3

Pour illustrer par un exemple pas du tout (mais alors pas du tout) optimisé :

> cp -R source dest
> rm -r dest/include/ #cas1
> rm dest/<fichier quelconque # cas 2
> rm -r dest/coco/bidule/* #cas 3

Je sais que je peux le faire avec la commande find ??????? -exec rm -r {} (quelque chose comme ça :-) mais je n'y arrive pas, il y a rien à faire :-(, j'ai même bloquer mon pc, plus de clavier... !

Alors si quelqu'un maitrise cette commande ô combien puissante, j'attends son commentaire avec impatience.
Sinon une solution avec un bon vieux "grep -v" me paraitrait moins "optimale" (quoique) mais serait la bienvenue également.
Merci.

6 réponses

bonsoir,
je ne suis pas un pro du bash loin de la ...
mais il me semble que pour le cas 1 tu peux faire

cp $(ls |sed -e '/nomdurepignoré/*/d')

pour le 2

cp $(ls |sed -e '/nomdufichier*/d')

pour le 3 hmmm
en esperant que ca t'aide ...
0
chris79 Messages postés 91 Date d'inscription lundi 3 octobre 2005 Statut Membre Dernière intervention 1 février 2016 25
10 févr. 2010 à 10:12
Je n'avais effectivement pas pensé à quelque chose comme ça, mais je vais tenter.
Je te tiens au courant.
Merci.
0
/usr/share/doc/bash (exemples)
/usr/share/doc-base/bash (tutos)
0
chris79 Messages postés 91 Date d'inscription lundi 3 octobre 2005 Statut Membre Dernière intervention 1 février 2016 25
10 févr. 2010 à 10:13
Merci pour les liens, je vais jeter un oeil :-)
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
10 févr. 2010 à 10:06
Salut,

Sur une seule commande ce n'est pas possible, et à la limite, ta solution est sûrement ce qui irait le mieux.

Il faut surtout prendre en compte si ce que tu veux faire est une tâche isolée (à ne faire qu'une fois) ou une tâche répétitive.

Si ce n'est qu'une seule fois, ta méthode reste la plus optimisée.

Si répétition, voir alors avec des commandes comme "rsync" ou "tar" qui incluent des paramètres permettant d'exclure des répertoires et des fichiers lors du traitement.

La commande "find" pour ce genre de chose reste assez lourde, surtout la syntaxe de l'option "-prune" pour omettre des répertoires et/ou fichiers..
0
chris79 Messages postés 91 Date d'inscription lundi 3 octobre 2005 Statut Membre Dernière intervention 1 février 2016 25
10 févr. 2010 à 10:18
C'est effectivement une tache répétitive destinée à être exécutée dans un script.

Pis surtout, mon répertoire source fait environ 400 Mo alors que le répertoire dest, une fois nettoyé, fait environ 20 Mo !! Alors copier 380 Mo pour les effacer la ligne suivante...je ne trouve pas cela terrible :-).

Par contre une solution à base de "tar" me parait intéressante....je vais voir cela plus en détail.

Dans tous les cas, merci !
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
10 févr. 2010 à 10:25
Dans ce cas là, rsync me parait encore plus approprié alors...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pourquoi ma proposition est elle "mauvaise" ?
(je cherche a apprendre un ...)
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
10 févr. 2010 à 10:49
Elle n'est pas mauvaise, c'est juste que ce qu'il veut faire est assez biscornu, et si on commence à se lancer dans des commandes comme celles citées plus haut, il n'est pas arrivé ;-\

A partir du moment où il existe des commandes ou des programmes implémentant nativement les besoins recherchés, pas la peine de se casser la tête à chercher (ou juste pour se faire plaisir alors) des solutions quelque peu tordues, non ?
0
chris79 Messages postés 91 Date d'inscription lundi 3 octobre 2005 Statut Membre Dernière intervention 1 février 2016 25
18 févr. 2010 à 16:40
Salut,
bon je viens poster la solution que j'ai retenue, c'est celle à base de la commande rsync.
Cela donne quelque chose comme :

rsync -rltgoDv --exclude=include --exclude=<fichier quelconque> --exclude=coco/bidule/* source dest

Cela respecte précisément ce que je voulais faire.
Merci à vous !
++
0