Pages : 1
#1 Le 23/12/2020, à 14:53
- zephyre123
Question sur find [RESOLU]
Bonjour,
Je souhaite trouvé tous les fichiers .pdf du répertoire courant.
Pouvez vous m'expliquer la différence entre ces deux commandes :
- find -name *.pdf
et
- find -name \*.pdf
Elle ne fond pas du tout la même chose lorsque je les testes et je ne comprends pas pourquoi il faut échapper le caractère '*' pour trouver tous les fichiers .pdf du répertoire courant.
Merci pour vos explications.
Dernière modification par zephyre123 (Le 27/12/2020, à 15:37)
Hors ligne
#2 Le 23/12/2020, à 15:41
- pingouinux
Re : Question sur find [RESOLU]
Bonjour,
Fais précéder les commandes de
set -x
et tu verras qu'elles ne sont pas interprétées de la même façon.
De plus, si tu veux te limiter au répertoire courant et ne pas descendre dans l'arborescence
find -maxdepth 1 -name ...
Hors ligne
#3 Le 23/12/2020, à 16:25
- Hizoka
Re : Question sur find [RESOLU]
Salut, perso je ne vois pas de différence :
find -name \*.pdf
+ find -name '*.pdf'
find -name *.pdf
+ find -name '*.pdf'
et il me remonte la même chose.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#4 Le 23/12/2020, à 16:45
- pingouinux
Re : Question sur find [RESOLU]
perso je ne vois pas de différence
Tu ne vois de différence que s'il y a plus d'un fichier *.pdf dans le répertoire courant.
Hors ligne
#5 Le 23/12/2020, à 17:00
- Hizoka
Re : Question sur find [RESOLU]
En effet, le résultat n'est plus le même
find -name \*.pdf
+ find -name '*.pdf'
find -name *.pdf
+ find -name 'XXX.pdf'
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#6 Le 23/12/2020, à 17:22
- pingouinux
Re : Question sur find [RESOLU]
C'est encore plus flagrant s'il y a plusieurs fichiers *.pdf.
Hors ligne
#7 Le 23/12/2020, à 17:30
- Watael
Re : Question sur find [RESOLU]
il faut protéger l'astérisque, sinon le shell effectue le Remplacement des chemins, et ce n'est pas ce qu'on veut.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#8 Le 26/12/2020, à 17:07
- zephyre123
Re : Question sur find [RESOLU]
il faut protéger l'astérisque, sinon le shell effectue le Remplacement des chemins, et ce n'est pas ce qu'on veut
Donc si je comprends bien :
find -name *.pdf
va chercher dans les répertoires nommés *.pdf
et
find -name \*.pdf va chercher dans le répertoire courant tous les fichiers .pdf c'est bien ça Watael, c'est ce que tu voulais me dire ?
Hors ligne
#9 Le 26/12/2020, à 17:27
- Watael
Re : Question sur find [RESOLU]
find -name *.pdf va chercher les fichiers qui correspondent au fichier .pdf qui existe dans le répertoire courant, et pas tous les fichiers ayant une extension .pdf.
S'il y en a plusieurs, find sort avec une erreur, parce que -name ne peut prendre qu'un seul motif !
S'il n'y en a pas, find prend le motif pour lui.
avec les apostrophes autour du motif, find prend le motif pour lui inconditionnellement, puisque le shell n'effectue pas de développement.
on l'observe bien avec le set -x
Dernière modification par Watael (Le 26/12/2020, à 17:27)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#10 Le 26/12/2020, à 17:38
- erresse
Re : Question sur find [RESOLU]
Pas vraiment... Ce que voulait montrer Watael, c'est que sans protéger l'astérisque, on obtient le développement des chemins par l'interpréteur bash (tu vois la ligne interprétée : "+ find -name a-xx b-xx c-xx d-xx" ci-dessous). Et d'ailleurs, il ressort une erreur...
user@Ubuntu-Mate-2004:~/tests$ set -x
user@Ubuntu-Mate-2004:~/tests$ find -name *-xx
+ find -name a-xx b-xx c-xx d-xx
find: paths must precede expression: `b-xx'
find: possible unquoted pattern after predicate `-name'?
Par contre, en protégeant l'astérisque, l'expression n'est pas développée (ligne interprétée : "+ find -name '*-xx'" ci-dessous). Et le résultat liste bien tous les fichiers trouvés...
user@Ubuntu-Mate-2004:~/tests$ find -name \*-xx
+ find -name '*-xx'
./b-xx
./d-xx
./c-xx
./a-xx
user@Ubuntu-Mate-2004:~/tests$ set +x
+ set +x
user@Ubuntu-Mate-2004:~/tests$
Note: l'instruction "set -x" qui active la trace dans bash, permet de voir comment l'interpréteur développe la commande avant de l'exécuter. Pour désactiver, il suffit de taper l'instruction "set +x".
Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois le problème solutionné, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.
Hors ligne
#11 Le 26/12/2020, à 23:42
- zephyre123
Re : Question sur find [RESOLU]
Les deux commandes (find -name *.pdf et find -name \*.pdf) donne le même résultat lorsqu'il n'y a aucun fichiers.pdf dans le répertoire courant.
Maintenant avec un seul fichier.pdf dans le répertoire courant avec l'option set -x voila ce que j'obtiens :
find -name *.pdf
+ find -name langage_c.pdf
et
find -name \*.pdf
+ find -name '*.pdf'
Maintenant avec plus d'un fichier.pdf dans le répertoire courant avec l'option set -x voila ce que j'obtiens :
find -name *.pdf
+ find -name Introduction_ANSI_C-B.Cassagne_stop_page37_procedure.pdf langage_c.pdf
find: paths must precede expression: `langage_c.pdf'
find: possible unquoted pattern after predicate `-name'?
et
find -name \*.pdf
+ find -name '*.pdf'
./c++/c++.pdf
./c/langage_c.pdf
./c/C20H_integrale_creative-commons-by-sa.pdf
./c/Introduction_ANSI_C-B.Cassagne_stop_page37_procedure.pdf
./langage_c.pdf
./java/java.pdf
./java/JavaDoudoux.pdf
./java/conception-d-applications-en-java-jee-principes-patterns-et-architectures.pdf
./java/Oracle Certified Professional Java SE 8 Programmer Exam 1Z0-809.pdf
./java/Exercices en Java - Claude Delannoy - Eyrolles (2ème Ed.) 2006.pdf
./script_et_ligne_de_commande/bash/expert_bash.pdf
./script_et_ligne_de_commande/bash/introduction_programmation_bash.pdf
./script_et_ligne_de_commande/bash/programmation_systeme.pdf
./script_et_ligne_de_commande/bash/shell_linux_et_unix_par_la_pratique_blaess.pdf
./script_et_ligne_de_commande/bash/guide_bash_debutant.pdf
./script_et_ligne_de_commande/script.pdf
./sql/My_SQL.pdf
./Introduction_ANSI_C-B.Cassagne_stop_page37_procedure.pdf
find -name *.pdf va chercher les fichiers qui correspondent au fichier .pdf qui existe dans le répertoire courant, et pas tous les fichiers ayant une extension .pdf.
S'il y en a plusieurs, find sort avec une erreur, parce que -name ne peut prendre qu'un seul motif !
S'il n'y en a pas, find prend le motif pour lui.
Ok j'ai compris que lorsqu'il y a effectivement plusieurs fichiers.pdf dans le repertoire courant la commande find -name *.pdf => erreur car -name ne prends qu'un seul motif
Ok j'ai compris que lorsqu'il n'y a pas de fichier.pdf => même résultat que la commande find -name \*.pdf
KO je ne comprends pas par qui est interpréter en premier le joker *, par la commande find ou bien par le bash ?
Moi perso j'aurai tendance à dire par le bash et c'est justement ça le problème on veut que le joker soit interpréter par le find et non par la bash.
J'ai bien tout compris ?
Ce que je veux dire pour être plus précis c'est que si on a exactement deux fichiers.pdf par exemple f1.pdf et f2.pdf dans le repertoire courant et plusieurs fichiers.pdf en dessous de l'arborescence
alors find -name *.pdf, le joker * est interprété par le bash et remplace cette expression par find -name f1.pdf f2.pdf et ça fou la merde par ce que -name ne prends qu'un seul motif
Mais
si on écris find -name \*.pdf le joker * n'est pas interprété par le bash mais par find et find recherche dans le repertoire courant tous les fichiers.pdf
C'est bien ça ?
Dernière modification par zephyre123 (Le 27/12/2020, à 00:40)
Hors ligne
#12 Le 27/12/2020, à 06:31
- Watael
Re : Question sur find [RESOLU]
"KO" : ça dépend... si l'astérisque est protégé, c'est find, sinon, c'est bash.
dans tous les cas bash tente de faire le Développement, et s'il n'y a pas de fichier(s), il retourne la chaîne telle quelle.
on observe la même chose avec prinf, par exemple :
$ printf '%s\n' '*.ext' # pas de développement
*.ext # le motif peut être utilisé par `find'
$ printf '%s\n' *.ext # pas de correspondance -> pas de développement
*.ext # le motif peut être utilisé par `find'
$ > fichier.ext
$ printf '%s\n' *.ext # une seule correspondance
fichier.ext # le motif peut être utilisé par `find'
$ > fichier2.ext
$ printf '%s\n' *.ext
fichier.ext # trop de motifs
fichier2.ext # ils ne peuvent pas être utilisés par `find'
$ rm *.ext
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#13 Le 27/12/2020, à 09:18
- FrancisFDZ
Re : Question sur find [RESOLU]
Bonjour,
J'ai toujours utilisé find en lui précisant d'abord le point de départ de la recherche, ici l'aurais utilisé
find . -name "*.pdf"
qui recense tous les fichiers pdf dans le répertoire courant (.) et les répertoires inclus dans celui-ci. Du coup, je comprend mal l'utilisation de l'échappement et ses effets de bord (je mets toujours aussi le motif de recherche entre "doubles quotes" pour justement éviter l'emploi du "\", caractère d'échappement)
-- On peut avoir des raisons de se plaindre et n'avoir pas raison de se plaindre --
[Victor Hugo]
Hors ligne
#14 Le 27/12/2020, à 15:37
- zephyre123
Re : Question sur find [RESOLU]
C'est bon j'ai compris dans les grandes lignes je vous remercie pour vos précieuses explications.
Je clos le sujet.
Hors ligne