Difficultés avec la syntaxe de find

Le
gvdmoort
Bonjour à tous,

Je travaille avec find-GNU version 4.2.28 sur une Debian Etch.

J'aimerais déplacer ou effectuer des opérations sur une série de
fichiers mails dispersés dans une arborescence de dossiers MH, c-à-d
que chaque mail est un fichier isolé situé dans un sous répertoire
"cur".

$ find /home/secretariat/Maildir/ -name cur

/home/secretariat/Maildir/cur
/home/secretariat/Maildir/.Drafts/cur
/home/secretariat/Maildir/.Trash/cur
/home/secretariat/Maildir/.Sent/cur
/home/secretariat/Maildir/.INBOX.ARCHIVES/cur
/home/secretariat/Maildir/.SPAM/cur
/home/secretariat/Maildir/.INBOX.International/cur

(etc.)

$ find /home/secretariat/Maildir/ -name cur -exec ls -1 {} ;
1201682437.P26050Q5.courrier:2,S
1202120221.P5599Q1.courrier:2,S
1193320351.P17899Q1M23841.courrier:2,RS

(etc.)

Les noms des fichiers sont donc aléatoires, tout ce qu'on peut faire
pour les sélectionner est de veiller à ce qu'ils appartiennent à un
répertoire dénommé 'cur'

Dans le premier cas, la commande renvoie le chemin complet du fichier-
répertoire, dans le second, seulement le nom du fichier.

Tout d'abord, pourquoi

$ find /home/secretariat/Maildir/ -name cur -exec ls {}/* ;

renvoie-t-elle pour chaque répertoire

ls: /home/secretariat/Maildir/.INBOX.International/cur/*: Aucun
fichier ou répertoire de ce type

alors que

$ ls /home/secretariat/Maildir/.INBOX.International/cur/*

renvoie bien les chemins complets des fichiers du répertoire ?

Ensuite, je ne trouve pas non plus comment exécuter une série de
commandes pour chaque résultat de la commande find. Par exemple, pour
chaquun des répertoires "cur" je pourrais imaginer me déplacer, dans
ce répertoire, faire une copie de chaque fichier vers un autre
répertoire, puis passer au suivant, etc.

Mais déjà qu'un

$ find /home/secretariat/Maildir/ -name cur -exec cd "{}" ;
ou
$ find /home/secretariat/Maildir/ -name cur -exec cd {} ;

me renvoie

find: cd: Aucun fichier ou répertoire de ce type

j'avoue que je ne comprend pas du tout la logique de cette commande.

Donc si vous avez des explications pour me faire avancer dans la
compréhension de cette commande, elles sont bienvenues.

Merci d'avance,

Gvdm
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
mpg
Le #800003
wrote:

J'aimerais déplacer ou effectuer des opérations sur une série de
fichiers mails dispersés dans une arborescence de dossiers MH, c-à-d
que chaque mail est un fichier isolé situé dans un sous répertoire
"cur".

Ok.


Les noms des fichiers sont donc aléatoires, tout ce qu'on peut faire
pour les sélectionner est de veiller à ce qu'ils appartiennent à un
répertoire dénommé 'cur'

Super. En gros tu veux des gens dont le nom complet matche la

regex .*/cur/[^/]* ? Pourquoi ne pas essayer la ligne suivante :

find /home/secretariat/Maildir/ -regex '.*/cur/[^/]*'

Tout d'abord, pourquoi

$ find /home/secretariat/Maildir/ -name cur -exec ls {}/* ;

renvoie-t-elle pour chaque répertoire

ls: /home/secretariat/Maildir/.INBOX.International/cur/*: Aucun
fichier ou répertoire de ce type

Parce que c'est vrai. Il n'y a pas de fichier qui s'appelle '*' dans aucun

de tes répertoires cur/. Les wildcards comme * sont gérés par le shell, pas
par ls. Ici, ton shell voit {}/* et ne trouve aucun fichier qui correspond
à ce motif. Si c'était zsh, il gueulerait tout de suite parce que "no match
found" (dans son comportement par défaut). Le comportement par défaut de
bash est au contraire de faire celui qui n'a rien vu, et de laissé le
wildcard non développé sur la ligne de commande, en espérant que les autres
commandes sauront ce démerder avec (supposition le plus souvent mauvaise,
voir dangereuse).

alors que

$ ls /home/secretariat/Maildir/.INBOX.International/cur/*

renvoie bien les chemins complets des fichiers du répertoire ?

Parce que ton shell a trouvé des fichiersqui correspondaient au motif en

question. Il les a donc substitué au motif, avant de passer le tout à ls,
qui, ne voyant que des noms de ficheirs qui existent sur sa ligne de
commande, a fait joyeusement son travail. Il faut bien voir que dans la
ligne de commande précédent ls sert juste à afficher les trucs en colonne
et éventuellement en couleurs.

Ensuite, je ne trouve pas non plus comment exécuter une série de
commandes pour chaque résultat de la commande find. Par exemple, pour
chaquun des répertoires "cur" je pourrais imaginer me déplacer, dans
ce répertoire, faire une copie de chaque fichier vers un autre
répertoire, puis passer au suivant, etc.

Si je voulais exécuter une série de commandes, j'écrirais sans doute un

petit script, puis je demanderais à find de l'exécuter.

Mais déjà qu'un

$ find /home/secretariat/Maildir/ -name cur -exec cd "{}" ;
ou
$ find /home/secretariat/Maildir/ -name cur -exec cd {} ;

me renvoie

find: cd: Aucun fichier ou répertoire de ce type

j'avoue que je ne comprend pas du tout la logique de cette commande.

Je ne comprends pas trop ce que tu attendais d'un cd comme ça. De toutes

façons, cd est une directive interne au shell, pas une vraie commande. Find
n'exécute que des vraies commandes.

Donc si vous avez des explications pour me faire avancer dans la
compréhension de cette commande, elles sont bienvenues.

J'espère que ça aide.



Manuel.

Jogo
Le #800002
Sur fr.comp.os.unix, disait :

$ find /home/secretariat/Maildir/ -name cur

$ find /home/secretariat/Maildir/ -name cur -exec ls -1 {} ;

Dans le premier cas, la commande renvoie le chemin complet du fichier-
répertoire, dans le second, seulement le nom du fichier.

Tout d'abord, pourquoi


find affiche toujours le chemin complet à partir du path qu'on lui
donne en premier argument. ls par contre est un peu plus "bizarre" : si
on lui donne un répertoire, il ne donne aucun chemin, et si on lui
donne un fichier, il donne le chemin qu'on lui a fourni pour ce fichier.

Ensuite, je ne trouve pas non plus comment exécuter une série de
commandes pour chaque résultat de la commande find. Par exemple, pour
chaquun des répertoires "cur" je pourrais imaginer me déplacer, dans
ce répertoire, faire une copie de chaque fichier vers un autre
répertoire, puis passer au suivant, etc.


Pour ce cas là pourquoi pas :

find /ici -path '*/cur/*' -type f -exec cp -a '{}' /ailleur ';'

--
Le monde du peintre est un monde visible, rien que visible,
un monde presque fou, puisqu'il est complet n'étant cependant
que partiel.
-- Merleau-Ponty

Mihamina Rakotomandimby
Le #800001
mpg wrote:

De toutes façons, cd est une directive interne au shell, pas une vraie commande. Find
n'exécute que des vraies commandes.


C'est à dire "celles-qui-ont-un-binaire-a-elles-toutes-seules"?

gvdmoort
Le #800000
On 4 fév, 18:31, mpg
J'espère que ça aide.


Beaucoup. Un grand merci, ainsi qu'à Jogo.

Cordialement,

G.

mpg
Le #799999
Mihamina Rakotomandimby wrote:

mpg wrote:

De toutes façons, cd est une directive interne au shell, pas une vraie
commande. Find n'exécute que des vraies commandes.


C'est à dire "celles-qui-ont-un-binaire-a-elles-toutes-seules"?


C'est en effet ce que je voulais dire. Mais il est tout à fait possible que
j'aie eu tort de vouloir dire ça :)

Manuel.


Publicité
Poster une réponse
Anonyme