En
ls -d ./foldername/*.{a,b,}test
{a,b,...}
no es un operador global, eso es expansión de llaves, primero se expande para:
ls -d ./foldername/*.atest ./foldername/*.btest ./foldername/*.test
Y cada globo se expandió individualmente, y si algún globo no coincide, el comando se cancela como es de esperar en zsh
(o fish
; en bash
, necesita la failglob
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:
ls -d ./foldername/*.(a|b|)test
No desea utilizarlo nullglob
, ya que si ninguno de los globs coincidiera, se ejecutaría ls
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, lo bash
cual sería una pena.
Para una alternativa glob que funcione en ambos zsh
y bash
, puede usar los globos ksh ( set -o kshglob
in zsh
y shopt -s extglob
in bash
).
Entonces, harías:
ls -d ./foldername/*.@(a|b|)test
o:
ls -d ./foldername/*.?([ab])test
Agregue la failglob
opción bash
para evitar que el glob se pase literalmente a ls
cuando no coincida.
Consulte ¿Por qué nullglob no es el predeterminado? para más información.
/dev/null
?