As únicas opções shopt
relacionadas à expansão de nome de arquivo são dotglob
, failglob
, nocaseglob
e nullglob
e nenhuma delas (sozinha ou combinada) parece fazer exatamente o que você deseja. É uma pena porque parece uma boa ideia.
Minha recomendação é ter failglob
definido em sessões interativas, para evitar comandos potencialmente indesejados, como:
mv -r file1 file2 dir1 dir2 destination-*-dir
onde file1
, file2
e dir1
seriam movidos para dir2
se destination-*-dir
não corresponder a nada e nullglob
for definido.
Por outro lado, não é uma boa idéia confiar inteiramente em expansões de nomes de arquivos quando scripts de shell. É recomendável sempre validar se tais expansões existem e são o que deveriam ser.
Quero dizer, em vez de fazer isso:
rm -- *.jpg *.txt
É melhor fazer algo assim:
for file in *.jpg *.txt; do
if [ -f "${file}" ]; then
rm -- "${file}"
fi
done
# Or this (non-POSIX, as it uses an array)
for file in *.jpg *.txt; do
if [ -f "${file}" ]; then
files_to_delete+=( "${file}" )
fi
done
if [ "${#files_to_delete[@]}" -gt 0 ]; then
rm -- "${files_to_delete[@]}"
fi
Dessa forma, você estará seguro, mesmo que, por exemplo, alguns arquivos correspondam a *.txt
, mas na verdade é um diretório.