les wild-cards sur trouver et ls
Je suis à essayer de comprendre les wild-cards pour faire des opérations sur les fichiers.
J'ai ces fichiers dans un répertoire à des fins de test:
file_BSD.GIF file_linux.gif file_unix
Voir ma commande ls,
$ ls *{.GIF,.gif}
file_BSD.GIF file_linux.gif
Qui est OK.
Mais "trouver" ne semble pas fonctionner de la même manière:
$ find -name *{.GIF,.gif}
find: paths must precede expression: file_linux.gif
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
Par ailleurs, j'ai lu que "-iname" devraient trouver à la fois des majuscules et des minuscules, des fichiers, mais cela ne semble pas fonctionner soit:
$find -iname *.gif
./file_linux.gif
(Ce doit rechercher les .GIF fichier en tant que bien, non?).
- Pour utiliser
-iname
que vous voulez, vous devez indiquer le motif de vous en donner. J'ai ajouté cela comme une réponse. - En aparté, je pense qu'il est intéressant de noter que les accolades (
{}
) dans-name
modèle ne sont pas reconnus comme étant spécial (Voir-name pattern
dans linuxcommand.org/man_pages/find1.html). Par exemple, vous ne pouvez pas trouver les jpg et jpeg comme ceci:find -iname '*.jp{,e}g'
.
Vous devez vous connecter pour publier un commentaire.
find -name *{.GIF,.gif}
est faux.Cette commande est d'abord exapanded par shell pour
find -name *.GIF *.gif
Puis plus loin élargi à
Maintenant ce
-name file_BSD.GIF file_linux.gif
est passé àfind
. Et c'est mal comme il n'y a pas de commutateur, commefile_linux.gif
qui est accepté par trouver.Ce que vous avez besoin est de cette commande.
Qui est la même que
Notez les guillemets simples (
'
) ici. Cela signifie*.GIF
doit être envoyé à la recherche de comme sans coquille d'expansion. Et trouver la volonté de l'utiliser comme modèle. Cette apostrophe est nécessaire, à moins que vous échapper à la coque méta-caractères. Dans ce cas, la commande devrait ressembler àfind -iname '*.gif'
" Pas de. Ce sera heureux d'accepter un fichier se terminant par.giF
, qui la commande précédente ne pas accepter.find \( -name '*.GIF' -or -name '*.gif' \) -print
. Notez qu'il y a des espaces entre les crochets.Vous rencontrez des problèmes avec le paramètre
-iname
defind
parce que vous devez indiquer les motifs que vous avez donner.Donc, vous devriez faire:
Ce qui est indiqué dans le manuel:
Vous devez comprendre que (contrairement à Windows), le shell est l'expansion de la
*{.GIF,.gif}
avant de passer à l'find
programme.Vous pouvez ressentir ce que le shell n'en remplaçant le programme avec
echo
.De sorte que vous devez citer le programme d'argument, comme
donc courir
Peut-être vous voulez
Veuillez lire la Advanced Bash Scripting Guide (et peut-être le execve(2) page de man, pour comprendre comment le noyau exécuter des programmes).