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.
*.xml
ne 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. find
est 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 ls
avec 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 echo
ne 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
, *.xml
où *
est cité. Puisque *
est cité, c'est un caractère ordinaire en ce qui concerne le shell.find
avec la liste d'arguments spécifiée: .
, -name
, *.xml
.find
recherche les fichiers dont le nom correspond au modèle *.xml
dans n'importe quel répertoire du répertoire courant.Lorsque vous exécutez find . -name *.xml
et qu'aucun fichier ne correspond *.xml
:
find
, .
, -name
, *.xml
où l' *
on ne cite.*.xml
contient 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é.find
avec la liste résultante des arguments, ce qui est .
, -name
, *.xml
.find
recherche les fichiers dont le nom correspond au modèle *.xml
dans n'importe quel répertoire du répertoire courant.Lorsque vous exécutez find . -name *.xml
et que le répertoire actuel contient file1.xml
, file2.xml
et file3.xml
:
find
, .
, -name
, *.xml
où l' *
on ne cite.*.xml
contient un caractère générique non cité, le shell effectue la génération du nom de fichier: *.xml
est remplacé par la liste des noms de fichiers correspondants.find
avec la liste résultante des arguments, ce qui est .
, -name
, file1.xml
, file2.xml
, file3.xml
.find
se plaint d'une erreur de syntaxe lorsqu'elle atteint file2.xml
.Lorsque vous exécutez find . -name *.xml
et que le répertoire actuel contient un seul fichier correspondant file.xml
:
find
, .
, -name
, *.xml
où l' *
on ne cite.*.xml
contient un caractère générique non cité, le shell effectue la génération du nom de fichier: *.xml
est remplacé par la liste des noms de fichiers correspondants.find
avec la liste résultante des arguments, ce qui est .
, -name
, file.xml
.find
voit une commande parfaitement valide, mais ce n'est probablement pas ce que vous vouliez: find
on lui dit de rechercher les fichiers appelés file.xml
dans 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.