Cómo obtener una cadena vacía de un patrón global sin coincidencias


24

Digamos que tengo una carpeta con tres archivos:

foo1
foo2
bar

1. Si corro

list_of_files=$(print foo*)
echo $list_of_files

Yo obtengo: foo1 foo2

2. Si corro

list_of_files=$(print bar*)
echo $list_of_files

Yo obtengo: bar

3. Sin embargo, si corro

list_of_files=$(print other*)
echo $list_of_files

Obtengo: zsh: no matches found: other*( $list_of_filesaunque la variable está vacía)


¿Hay alguna manera de pedirle a zsh que no se queje si no puede igualar una expansión global?

Mi objetivo es utilizar el mecanismo anterior para recopilar silenciosamente una lista de archivos que coinciden con un patrón global determinado.

Respuestas:


33

Active la null_globopción para su patrón con el Ncalificador global.

list_of_files=(*(N))

Si está haciendo esto en todos los patrones en un script o función, active la null_globopción:

setopt null_glob

Esta respuesta tiene bash y ksh equivalentes.

¡No use printni ordene la sustitución! Eso genera una cadena que consiste en los nombres de archivo con espacios entre ellos, en lugar de una lista de cadenas. (Consulte ¿Qué es la división de palabras? ¿Por qué es importante en la programación de shell? )


15

La mejor manera: for a in *(.N); do ... ; done. La opción N hace que zsh entregue una lista vacía para for y for iterará cero veces.

Cuidado con ls *.foo(.N); Cuando ls recibe una lista de argumentos vacía, lista todos los archivos en lugar de ninguno. Es por eso que no me gusta NULL_GLOB (o su equivalente bash): Cambia todos los globos y fácilmente interrumpe las llamadas a, por ejemplo, ls.


Me gustaría ver tu respuesta aquí @arnt, esto es justo lo que necesitaba.
GMT

¿Por qué el .en (.N)? Otras respuestas tienen (N)por sí mismas, ¿cuál es la diferencia?
Michael Dorst

La pregunta era acerca de los archivos, y .restringe el globo para que solo coincida con los archivos.
Arnt

4

Creo que estás buscando la NULL_GLOBopción:

   NULL_GLOB (-G)
          If a pattern for filename generation has no matches, delete  the
          pattern  from  the  argument list instead of reporting an error.
          Overrides NOMATCH.

-1

Intenta de esta manera:

list_of_files=$(print other*) 2>/dev/null

Redirigirá la salida de error de stderr a / dev / null y no se mostrará.


Eso no funciona en absoluto.
Pablo Olmos de Aguilera C.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.