Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Difficultés avec la syntaxe de find

5 réponses
Avatar
gvdmoort
Bonjour =E0 tous,

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

J'aimerais d=E9placer ou effectuer des op=E9rations sur une s=E9rie de
fichiers mails dispers=E9s dans une arborescence de dossiers MH, c-=E0-d
que chaque mail est un fichier isol=E9 situ=E9 dans un sous r=E9pertoire
"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=E9atoires, tout ce qu'on peut faire
pour les s=E9lectionner est de veiller =E0 ce qu'ils appartiennent =E0 un
r=E9pertoire d=E9nomm=E9 'cur'

Dans le premier cas, la commande renvoie le chemin complet du fichier-
r=E9pertoire, 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=E9pertoire

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

alors que

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

renvoie bien les chemins complets des fichiers du r=E9pertoire ?

Ensuite, je ne trouve pas non plus comment ex=E9cuter une s=E9rie de
commandes pour chaque r=E9sultat de la commande find. Par exemple, pour
chaquun des r=E9pertoires "cur" je pourrais imaginer me d=E9placer, dans
ce r=E9pertoire, faire une copie de chaque fichier vers un autre
r=E9pertoire, puis passer au suivant, etc.

Mais d=E9j=E0 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=E9pertoire 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=E9hension de cette commande, elles sont bienvenues.

Merci d'avance,

Gvdm

5 réponses

Avatar
mpg
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.

Avatar
Jogo
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

Avatar
Mihamina Rakotomandimby
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"?

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


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

Cordialement,

G.

Avatar
mpg
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.