Imaginez un arbre source. Il y a des fichiers xml partout.
Mais comme il y a un XYZ.xml à la racine de cet arbre, il ne trouvera pas mes fichiers xml.
find -iname *.xml
Retour
./XYZ.xml
au lieu de
./XYZ.xml
./a/b/c/bob.xml
./b/d/top.xml
Imaginez un arbre source. Il y a des fichiers xml partout.
Mais comme il y a un XYZ.xml à la racine de cet arbre, il ne trouvera pas mes fichiers xml.
find -iname *.xml
Retour
./XYZ.xml
au lieu de
./XYZ.xml
./a/b/c/bob.xml
./b/d/top.xml
Réponses:
find -iname '*.xml'
Dans le cas contraire, votre shell se dilate *.xmlà XYZ.xml, et la commande qui est exécuté en réalité
find -iname XYZ.xml
La raison pour laquelle cela fonctionne s'il n'y a pas de fichiers XML dans le répertoire courant est que les shells laissent généralement les caractères génériques non développés s'ils ne correspondent à rien. En général, chaque fois que vous voulez wildcards être élargi par un programme autre que le shell (par exemple par find, tar, scp, etc.) dont vous avez besoin de les citer de sorte que le shell ne tentera pas de les développer lui - même.
bash, pas de find.
Vous devez citer votre argument comme ceci:
find ./ -name '*.xml'
afin qu'il soit passé à rechercher au lieu d'être développé par le shell, puis passé à rechercher en tant que version développée.
*.xmlne correspond à rien dans le répertoire courant, il est transmis littéralement, c'est pourquoi cela fonctionne dans l'autre cas. Réponse très utile.
Les caractères génériques sont développés par le shell, pas par la commande. findest l'une des rares commandes qui effectue une correspondance générique similaire à celle du shell, en son temps.
Lorsque vous exécutez ls *.xml, le shell se développe d'abord *.xmlà la liste des fichiers correspondants, par exemple file1.xml file2.xml file3.xml, puis le shell appelle lsavec la liste d'arguments résultante file1.xml file2.xml file3.xml. C'est pourquoi vous voyez la même liste de noms de fichiers avec echo *.xml, même si elle echone sait rien des fichiers et ne se soucie pas de savoir si ses arguments sont des noms de fichiers.
Lorsque vous exécutez find . -name "*.xml":
find, ., -name, *.xmloù *est cité. Puisque *est cité, c'est un caractère ordinaire en ce qui concerne le shell.findavec la liste d'arguments spécifiée: ., -name, *.xml.findrecherche les fichiers dont le nom correspond au modèle *.xmldans n'importe quel répertoire du répertoire courant.Lorsque vous exécutez find . -name *.xmlet qu'aucun fichier ne correspond *.xml:
find, ., -name, *.xmloù l' *on ne cite.*.xmlcontient un caractère générique non cité, le shell effectue la génération du nom de fichier. Puisqu'il n'y a aucun nom de fichier correspondant, le modèle reste non développé.findavec la liste résultante des arguments, ce qui est ., -name, *.xml.findrecherche les fichiers dont le nom correspond au modèle *.xmldans n'importe quel répertoire du répertoire courant.Lorsque vous exécutez find . -name *.xmlet que le répertoire actuel contient file1.xml, file2.xmlet file3.xml:
find, ., -name, *.xmloù l' *on ne cite.*.xmlcontient un caractère générique non cité, le shell effectue la génération du nom de fichier: *.xmlest remplacé par la liste des noms de fichiers correspondants.findavec la liste résultante des arguments, ce qui est ., -name, file1.xml, file2.xml, file3.xml.findse plaint d'une erreur de syntaxe lorsqu'elle atteint file2.xml.Lorsque vous exécutez find . -name *.xmlet que le répertoire actuel contient un seul fichier correspondant file.xml:
find, ., -name, *.xmloù l' *on ne cite.*.xmlcontient un caractère générique non cité, le shell effectue la génération du nom de fichier: *.xmlest remplacé par la liste des noms de fichiers correspondants.findavec la liste résultante des arguments, ce qui est ., -name, file.xml.findvoit une commande parfaitement valide, mais ce n'est probablement pas ce que vous vouliez: findon lui dit de rechercher les fichiers appelés file.xmldans n'importe quel répertoire, de ne rechercher aucune correspondance de fichier *.xml.(L'évaluation et l'expansion de Shell ont beaucoup d'autres fonctionnalités. Je n'ai mentionné que celles qui sont pertinentes ici.)
(Ce que je décris est le comportement par défaut des shells les plus courants: sh, bash, dash, ksh,… Certains shells peuvent être configurés pour afficher une erreur au lieu d'exécuter une commande avec des caractères génériques non développés ou pour étendre les caractères génériques non correspondants à un vide Aucun de ceux-ci ne serait utile ici.)
Cela fonctionne sur Solaris 10:
find /directory-to-search/* -prune -name "*gz"
.xml.
S'il vous plaît essayez:
find ./ -name *.xml
*doit toujours être cité ou échappé pour le passer à trouver.
man find: Veuillez noter que vous devez bien sûr citer des modèles, sinon le shell développera tous les caractères génériques en eux.