De 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.
artdanil
Réponses:
18
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.
Thx, c'est si simple, mais je me demande comment contourner cela depuis des mois. J'ai trouvé ça vraiment bizarre, et c'était un comportement très incohérent, mais maintenant je comprends puisque ce n'est pas trouvé, mais la faute de bash.
Olivier Toupin
2
Ce n'est pas la "faute" de bash en soi, mais la vôtre pour ne pas avoir cité les caractères génériques que vous vouliez passer comme arguments. Cela vaut pour tous les programmes qui acceptent l'entrée shell. Le shell les développe en globes à moins qu'ils ne soient cités ou échappés.
Caleb
1
Je suppose qu'Olivier voulait dire cela dans le sens que c'est une question de bash, pas de find.
utilisateur inconnu
6
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.
Ok, donc si *.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.
Eric Wilson
1
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.xmlfile2.xmlfile3.xml, puis le shell appelle lsavec la liste d'arguments résultante file1.xmlfile2.xmlfile3.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":
Le shell analyse la ligne de commande pour reconnaître les caractères spéciaux et le diviser en mots et en ponctuation. Ici , il y a juste une liste de mots find, ., -name, *.xmloù *est cité. Puisque *est cité, c'est un caractère ordinaire en ce qui concerne le shell.
Le shell exécute la commande 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:
Le shell analyse la ligne de commande pour reconnaître les caractères spéciaux et le diviser en mots et en ponctuation. Ici , il y a juste une liste de mots find, ., -name, *.xmloù l' *on ne cite.
Puisque le mot *.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é.
Le shell exécute la commande 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:
Le shell analyse la ligne de commande pour reconnaître les caractères spéciaux et le diviser en mots et en ponctuation. Ici , il y a juste une liste de mots find, ., -name, *.xmloù l' *on ne cite.
Puisque le mot *.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.
Le shell exécute la commande 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:
Le shell analyse la ligne de commande pour reconnaître les caractères spéciaux et le diviser en mots et en ponctuation. Ici , il y a juste une liste de mots find, ., -name, *.xmloù l' *on ne cite.
Puisque le mot *.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.
Le shell exécute la commande 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 ne fonctionne pas lorsque le glob correspond à quelque chose dans le répertoire courant. C'est la mauvaise syntaxe! Le *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.Réponses:
Dans le cas contraire, votre shell se dilate
*.xml
àXYZ.xml
, et la commande qui est exécuté en réalité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.la source
bash
, pas defind
.Vous devez citer votre argument comme ceci:
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.
la source
*.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 exemplefile1.xml
file2.xml
file3.xml
, puis le shell appellels
avec la liste d'arguments résultantefile1.xml
file2.xml
file3.xml
. C'est pourquoi vous voyez la même liste de noms de fichiers avececho *.xml
, même si elleecho
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 contientfile1.xml
,file2.xml
etfile3.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 atteintfile2.xml
.Lorsque vous exécutez
find . -name *.xml
et que le répertoire actuel contient un seul fichier correspondantfile.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ésfile.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.)
la source
Cela fonctionne sur Solaris 10:
find /directory-to-search/* -prune -name "*gz"
la source
.xml
.S'il vous plaît essayez:
la source
*
doit toujours être cité ou échappé pour le passer à trouver.