Shell linux, commande find [Résolu/Fermé]

Signaler
Messages postés
91
Date d'inscription
lundi 3 octobre 2005
Statut
Membre
Dernière intervention
1 février 2016
-
Messages postés
91
Date d'inscription
lundi 3 octobre 2005
Statut
Membre
Dernière intervention
1 février 2016
-
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 ...
Messages postés
91
Date d'inscription
lundi 3 octobre 2005
Statut
Membre
Dernière intervention
1 février 2016
15
Je n'avais effectivement pas pensé à quelque chose comme ça, mais je vais tenter.
Je te tiens au courant.
Merci.
/usr/share/doc/bash (exemples)
/usr/share/doc-base/bash (tutos)
Messages postés
91
Date d'inscription
lundi 3 octobre 2005
Statut
Membre
Dernière intervention
1 février 2016
15
Merci pour les liens, je vais jeter un oeil :-)
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 756
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..
Messages postés
91
Date d'inscription
lundi 3 octobre 2005
Statut
Membre
Dernière intervention
1 février 2016
15
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 !
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 756
Dans ce cas là, rsync me parait encore plus approprié alors...
pourquoi ma proposition est elle "mauvaise" ?
(je cherche a apprendre un ...)
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 756
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 ?
Messages postés
91
Date d'inscription
lundi 3 octobre 2005
Statut
Membre
Dernière intervention
1 février 2016
15
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 !
++