Me gustaría enumerar todos los archivos en una carpeta llamada foldernameque tienen la extensión test, atesto 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 ellscomportamiento-maxdepthes una extensión de GNU. Tenga en cuenta otras 3 diferencias con globs:findincluirí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 lafailglobopció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íalssin argumentos, así que enumere el directorio actual.cshnullglobes 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, lobashcual sería una pena.Para una alternativa glob que funcione en ambos
zshybash, puede usar los globos ksh (set -o kshglobinzshyshopt -s extglobinbash).Entonces, harías:
o:
Agregue la
failglobopciónbashpara evitar que el glob se pase literalmente alscuando no coincida.Consulte ¿Por qué nullglob no es el predeterminado? para más información.
fuente
?(...)o+(...)para bash.