buscar * .swo

6

Creo que esto debería ser fácil, pero me ha dejado perplejo.

Cuando uso lo siguiente, encuentra el archivo.

$ ls -al  .bash_*.sw*   
-rw-r--r--  1 damiensawyer  staff  12288 27 Nov 07:39 .bash_profile.swo

Pero cuando uso esto, no lo encuentra.

$ ls -al *.sw*      
ls: *.sw*: No such file or directory

Esperé que el segundo comando también devolviera .bash_profile.swo . ¿Qué me estoy perdiendo?

    
pregunta Damien Sawyer 02.12.2015 - 22:48

4 respuestas

5

Usando ls

El problema es que su archivo tiene dos puntos, no uno. Necesitas tener en cuenta eso:

ls -al .*.sw*

Esto coincidirá con cualquier archivo que comience con un punto (archivos invisibles como .DS_Store ) y que también termine con .sw* .

.swa y .swz coincidirán.

Usando find

Puede usar lo siguiente para encontrar todos los archivos con la misma extensión ( swo en el caso a continuación) en un directorio.

find ~ -iname *swo

-iname encuentra una coincidencia que no distingue entre mayúsculas y minúsculas.

Puede buscar ese / esos archivos específicos usando esto:

find .bash_*.sw*

Nota: al utilizar ~ como ruta, se buscará en todo el directorio de inicio.

    
respondido por el Zach Gates 02.12.2015 - 22:54
6

Esto no es realmente causado por ls , ya que ls nunca expande los patrones.

La decisión sobre cómo expandir los patrones globales (patrones que contienen * y ? ) es tomada por el shell . Su shell es muy probable bash .

Por defecto, bash no realiza expansión de ruta en archivos de puntos. Sin embargo, puede hacerlo escribiendo explícitamente el . (como ya descubrió) o activando la opción dotglob . Desde la página de manual de bash:

  

dotglob Si está configurado, bash incluye los nombres de archivo que comienzan con '.' en los resultados de la expansión del nombre de ruta.

Para demostrar, simplemente imprimamos la expansión con echo en lugar de ls :

$ touch .bash_profile.swo

$ echo .*.swo
.bash_profile.swo

$ echo *.swo
*.swo

$ shopt -s dotglob

$ echo *.swo
.bash_profile.swo

Se puede encontrar más información sobre here .

    
respondido por el joeytwiddle 03.12.2015 - 04:03
3

El problema es que ls solo muestra los archivos que comienzan con un . , debes tener explícitamente el primer . en el archivo glob.

Así funcionará lo siguiente:

ls .*swo

Los shells de Unix expanden el globo antes de que ls vea los nombres de los archivos.

    
respondido por el Mark 02.12.2015 - 23:19
2

Estos patrones ( *.sw* y similares) se conocen como globs .

Como @Mark y @Zach Gates han notado, los globos no coinciden con los archivos cuyos nombres comienzan con un punto a menos que incluya explícitamente un . al comienzo del patrón. Esto se debe a que en los sistemas similares a UNIX (como OS X), los archivos que comienzan con un punto se consideran archivos "ocultos" y, por lo general, no se muestran de forma predeterminada.

La coincidencia global se realiza en realidad en su shell ( bash de forma predeterminada), no mediante comandos individuales como ls . Como se explica en el manual de bash en Expansión de nombre de archivo :

  

Después de la división de palabras ... Bash escanea cada palabra en busca de los caracteres " * ", " ? " y " [ ". Si aparece uno de estos caracteres, entonces la palabra se considera un patrón y se reemplaza con una lista ordenada alfabéticamente de nombres de archivos que coinciden con el patrón (consulte Coincidencia de patrones). Si no se encuentran nombres de archivo coincidentes, ... la palabra no se modifica.

     

Cuando se usa un patrón para la expansión del nombre de archivo, el carácter " . " al comienzo de un nombre de archivo o inmediatamente después de una barra debe coincidir explícitamente, a menos que la opción de shell dotglob esté establecida.

    
respondido por el Wolfgang 03.12.2015 - 03:50

Lea otras preguntas en las etiquetas