Eu gostaria de listar todos os arquivos em uma pasta chamada foldername
que têm a extensão test
, atest
ou btest
.
Meu pensamento imediato foi correr ls ./foldername/*.{a,b,}test
Isso funciona bem, a menos que não exista nada com a extensão atest
; nesse caso, recebo o erro zsh: no matches found: ./foldername/*.atest
.
Existe alguma maneira de simplesmente ignorar esse erro e imprimir os arquivos que existem?
Eu preciso que isso funcione tanto no ZSH quanto no BASH.
/dev/null
?Respostas:
Talvez seja melhor fazer isso com
find
:fonte
-maxdepth 1
, para emular mais perto ols
comportamento-maxdepth
é uma extensão GNU. Nota 3 outras diferenças com globs:find
incluiria arquivos ocultos, não tipo da lista e deixar de coincidir com nomes de arquivos que contêm bytes não formando caracteres válidos (como uma$'St\xe9phane.atest'
em um locale UTF-8)No
{a,b,...}
não é um operador da glob, isso é expansão de braçadeira, primeiro expandido para:E cada glob expandido individualmente e, se algum glob não corresponder, o comando será cancelado conforme o esperado em
zsh
(oufish
; inbash
, você precisará dafailglob
opção para obter um comportamento semelhante).Aqui, você deseja usar um único globo que corresponda a todos esses arquivos e cancelar o comando apenas se esse globo não corresponder a nenhum arquivo:
Você não deseja usar
nullglob
, como se nenhum dos globs correspondesse, ele seria executadols
sem argumentos, portanto, liste o diretório atual.cshnullglob
é melhor nesse sentido, pois remove globs não correspondentes, mas ainda cancela o comando se todos os globs falharem.Você não gostaria de usar
nonomatch
, pois isso daria a você o comportamento quebrado, obash
que seria uma pena.Para uma alternativa global que funcione em ambos
zsh
ebash
, você pode usar os globos ksh (set -o kshglob
inzsh
eshopt -s extglob
inbash
).Então, você faria:
ou:
Adicione a
failglob
opçãobash
para evitar que o glob seja transmitido literalmente parals
quando não corresponder.Consulte Por que o nullglob não é o padrão? Para maiores informações.
fonte
?(...)
ou+(...)
para o bash.