uso de * en la búsqueda de archivos

9

mientras leía sobre la búsqueda de archivos de Linux obtuve lo siguiente ...

Para buscar archivos con el comodín *, reemplace la cadena desconocida con *, por ejemplo, si recuerda solo que la extensión era .out, escriba ls * .out

y cuando probé el siguiente comando en el sistema (ubuntu 14.04 LTS) ... obtuve

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:~$

en el primer caso, por qué muestra No existe dicho directorio ( *.bash*) y en el siguiente caso muestra los archivos ( .bash*)

Soy nuevo en este sabor, y de acuerdo con mis clases de teoría de autómatas (*) significa cualquier combinación de cadenas, incluida epsilon (vacía). Entonces, ¿por qué los resultados son diferentes en ambos casos ...?

Lázaro
fuente

Respuestas:

11

Cuando lo hace ls *el *se está ampliando antes de que se pasa a ls. Es decir, si tenemos tres archivos ( a, by c) en un directorio se ls *está ejecutando realmente ls a b c.

Cuando Bash no puede expandirse, pasa a través de la cadena sin procesar¹. Es por eso que ve los comodines en el error, junto con un mensaje no encontrado. lsTraté de mostrar la lista de un archivo literalmente llamado *.bash*.

Entonces, ¿ por qué no se expandió eso? Bueno, por defecto, el globbing (como se llama esta expansión comodín) no devolverá archivos ocultos. Puede cambiar esto con shopt -s dotglob(eso no persistirá a menos que lo pegue en su .bashrc- podría deshabilitarse por defecto por una buena razón, así que tenga cuidado con eso), aquí hay una demostración rápida:

$ 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

La excepción a esto es —como ya has mostrado— cuando ya has declarado explícitamente que los archivos estarán ocultos con un patrón similar .bash*. Simplemente anula la dotglobconfiguración predeterminada :

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

De todos modos, además de ese capricho, espero que esto te ayude a comprender lo que está sucediendo bajo la superficie.


Hay otras shoptbanderas que alteran la forma en globbing obras: extglob, failglob, globstar, nocasegloby nullglob. Ellos y una serie de otras shoptbanderas están documentados como parte del manual de Bash .

Del mismo modo, la página sobre Coincidencia de patrones debería ser una buena lectura.

¹ A menos que estén failglobo nullglobestén configurados.

Oli
fuente
gracias @Oli ,, no entendí todo eso ya que mencioné que soy nuevo en este sabor, pero obtuve el 80% de eso ... Me ayudó
lazarus