Quero detectar se existe um de cada um dos seguintes tipos de arquivo em um diretório .png
, .txt
e .tar.gz
.
O seguinte funciona corretamente ao testar dois deles
shopt -s nullglob
MYDIR=/some_dir
if [ $MYDIR/*.png] && [ $MYDIR/*.txt]; then
echo "All files present"
else
echo "At least one type is missing"
fi
Mas se eu tentar testar todos os três usando
if [ $MYDIR/*.png] && [ $MYDIR/*.txt] && [ $MYDIR/*.tar.gz]; then
...
ou usando
if [[ $MYDIR/*.png && $MYDIR/*.txt && $MYDIR/*.tar.gz ]]; then
...
então não obtenho o comportamento correto (ele ainda retorna verdadeiro mesmo se um dos arquivos estiver faltando).
O que está acontecendo aqui?
Você não pode testar se um padrão globbing de nome de arquivo corresponde ao uso
[ ... ]
(e você não tem espaço antes do final]
em todos[ ... ]
os testes, então seu código não funcionaria de qualquer maneira).A maneira de fazer isso é realizar a correspondência e contar o número de nomes correspondentes.
Se você quiser digitar mais (ou apenas precisar preservar a lista existente de parâmetros posicionais), poderá usar um array nomeado. Mude a
set --
linha intonames=( "$MYDIR"/*."$ext" )
e"$#"
into"${#names[@]}"
. Observe que todas as citações são significativas.Você absolutamente precisa usar:
antes do teste para evitar falsos positivos,
$MYDIR/*.png
literalmente.Mas você não pode testar um curinga como este em um teste bash; em vez disso, você precisa testar o array:
Outra maneira de testar a existência do wilcard com
compgen
hack:Não se esqueça de adicionar o shebang do bash:
ou
[[
é uma palavra-chave bash semelhante (mas mais poderosa que) ao[
comando. Consulte http://mywiki.wooledge.org/BashFAQ/031 e http://mywiki.wooledge.org/BashGuide/TestsAndConditionals . A menos que você esteja escrevendo para POSIX sh, eu recomendo[[
Exemplo de uso:
não há necessidade de contar o número de ocorrências como você tentou.