Me gustaría enumerar todos los archivos en una carpeta llamada foldername
que tienen la extensión test
, atest
o btest
.
Mi pensamiento inmediato fue correr ls ./foldername/*.{a,b,}test
Esto funciona bien a menos que no haya nada con la extensión atest
, en cuyo caso obtengo el error zsh: no matches found: ./foldername/*.atest
.
¿Hay alguna manera de que simplemente pueda ignorar este error e imprimir los archivos que existen?
Necesito que esto funcione tanto en ZSH como en BASH.
/dev/null
?Respuestas:
Puede ser mejor hacer esto con
find
:fuente
-maxdepth 1
, para emular más de cerca ells
comportamiento-maxdepth
es una extensión de GNU. Tenga en cuenta otras 3 diferencias con globs:find
incluiría archivos ocultos, no ordenaría la lista y no coincidiría con los nombres de archivo que contienen bytes que no forman caracteres válidos (como un$'St\xe9phane.atest'
en una ubicación UTF-8)En
{a,b,...}
no es un operador global, eso es expansión de llaves, primero se expande para:Y cada globo se expandió individualmente, y si algún globo no coincide, el comando se cancela como es de esperar en
zsh
(ofish
; enbash
, necesita lafailglob
opción de obtener un comportamiento similar).Aquí, querrás usar un único globo que coincida con todos esos archivos, y solo cancelar el comando si ese globo no coincide con ningún archivo:
No desea utilizarlo
nullglob
, ya que si ninguno de los globs coincidiera, se ejecutaríals
sin argumentos, así que enumere el directorio actual.cshnullglob
es mejor en ese sentido, ya que elimina los globos que no coinciden pero aún cancela el comando si todos los globos no coinciden.No querrás usarlo
nonomatch
, ya que eso te daría un comportamiento roto, lobash
cual sería una pena.Para una alternativa glob que funcione en ambos
zsh
ybash
, puede usar los globos ksh (set -o kshglob
inzsh
yshopt -s extglob
inbash
).Entonces, harías:
o:
Agregue la
failglob
opciónbash
para evitar que el glob se pase literalmente als
cuando no coincida.Consulte ¿Por qué nullglob no es el predeterminado? para más información.
fuente
?(...)
o+(...)
para bash.