utilisation de * dans la recherche de fichiers


9

en lisant sur la recherche de fichiers linux, j'ai obtenu ce qui suit ...

Pour rechercher des fichiers à l'aide du caractère générique *, remplacez la chaîne inconnue par *, par exemple, si vous vous souvenez seulement que l'extension était .out, tapez ls * .out

et quand j'ai essayé la commande suivante sur le système (ubuntu 14.04 LTS) ... j'ai

anupam@JAZZ:~$ ls  *.bash* 

ls: cannot access  *.bash* : No such file or directory

anupam@JAZZ:~$ ls  .bash*

.bash_history   .bash_logout  .bash_profile  .bashrc

anupam@JAZZ:~$

dans le premier cas, pourquoi il n'affiche pas un tel répertoire ( *.bash*) et dans le cas suivant, il affiche les fichiers ( .bash*)

Je suis nouveau dans cette saveur, et selon mes classes de théorie des automates (*) signifie toute combinaison de chaînes, y compris epsilon (vide), alors pourquoi les résultats sont différents dans les deux cas ....?

Réponses:


11

Lorsque vous effectuez ls *le, vous êtes en *train de le développer avant de le passer à ls. C'est-à-dire si nous avons trois fichiers ( a, bet c) dans un répertoire ls *en cours d'exécution ls a b c.

Lorsque Bash ne peut pas se développer, il passe à travers la chaîne brute¹. C'est pourquoi vous voyez les caractères génériques dans l'erreur, ainsi qu'un message introuvable. lsessayé d'afficher la liste d'un fichier appelé littéralement *.bash*.

Alors pourquoi cela ne s'est-il pas étendu? Eh bien, par défaut, le globbing (ce que cette extension générique est appelée) ne retournera pas les fichiers cachés. Vous pouvez changer cela avec shopt -s dotglob(cela ne persistera pas à moins que vous ne le colliez dans votre .bashrc- il peut être désactivé par défaut pour une bonne raison, alors soyez prudent), voici une démo rapide:

$ ls  *.bash*
ls: cannot access *.bash*: No such file or directory
$ shopt -s dotglob
$ ls  *.bash*
.bash_aliases  .bash_history  .bash_logout  .bashrc  .bashrc.save

L'exception à cela est - comme vous l'avez déjà montré - lorsque vous avez déjà déclaré explicitement que les fichiers seront masqués avec un modèle comme .bash*. Il remplace simplement le dotglobparamètre par défaut :

$ shopt -u dotglob  # unset dotglob
$ ls .bash*
.bash_aliases  .bash_history  .bash_logout  .bashrc  .bashrc.save

Quoi qu'il en soit, outre cette bizarrerie, j'espère que cela vous aidera à comprendre ce qui se passe sous la surface.


Il existe d' autres shoptdrapeaux qui modifient la façon dont fonctionne englobement: extglob, failglob, globstar, nocaseglobet nullglob. Eux et un tas d'autres shoptdrapeaux sont documentés dans le cadre du manuel Bash .

De même, la page sur la correspondance de motifs devrait permettre une bonne lecture.

¹ Sauf si failglobou nullglobsont définis.


merci @Oli ,, je n'ai pas obtenu tout cela car j'ai mentionné que je suis nouveau dans cette saveur ,, mais j'ai obtenu 80% de cela ... Cela m'a aidé
lazarus
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.