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 -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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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/ -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.
gvdmoort@skynet.be 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/ -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'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/ -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
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
Sur fr.comp.os.unix, gvdmoort@skynet.be 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
$ 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
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"?
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"?