Como eu posso testar a extensão de arquivo .RAW?

0

Estou tentando configurar um script sh que será executado a cada 30 minutos. Durante cada execução, quero verificar um diretório para a presença de pelo menos um arquivo .RAW. Ao encontrar essa extensão de arquivo, terei outro código para executar, mas no momento estou tendo problemas para descobrir a instrução if correta a ser usada.

Eu sei que este exemplo de código não é a maneira mais ideal de fazer isso, mas aqui está o código que eu tentei que está obviamente errado:

cd ./dir/
if [ ! -f "*.RAW"]; then
  echo "No files!"
else
  echo "Yes files!"
fi

Como posso testar corretamente a presença da extensão .RAW?

    
por Alex26 22.08.2015 / 19:14

4 respostas

2

com zsh :

files=(*.RAW(DN))
if (($#files)); then
  echo Yes
else
  echo No
fi

Se você estiver interessado apenas em arquivos regulares (ou links simbólicos para arquivos regulares) como seu -f implica, seria:

file=(*.RAW(ND-.))

em vez disso.

POSIXly:

has_regfiles_by_extension() {
  for ext do
    for file in .*."$ext" ."$ext" *."$ext"; do
      [ -f "$file" ] && return
    done
    return 1
  done
}

if has_regfiles_by_extension RAW raw; then
  echo YES
else
  echo NO
fi

Se você quisesse usar ls , poderia fazer:

if ls -Aq | grep -q '\.RAW$'; then
  echo yes
else
  echo no
fi

Um dos benefícios é que, se o diretório não for legível, você receberá uma mensagem de erro (em vez de ser silenciosamente ignorado no caso de shell globs).

    
por 22.08.2015 / 19:30
0

Sua resposta de exemplo está quase correta. Primeiro, você precisa separar a string de teste ".RAW" do fechamento ] :

if [ ! -f "*.RAW" ];

Você pode fazer o shell globbing nesse contexto, colocando o asterisco fora das aspas. Então o comando acabado seria:

if [ ! -f *".RAW" ];

No entanto, essa abordagem não é tão útil se você quiser usar os arquivos .RAW . Se for esse o caso, eu compararia a extensão de cada arquivo no diretório da seguinte forma:

for file in "test/"*; do
    if [ "${file##*.}" = "RAW" ]; then
        echo "Found raw file"
    fi
done

A sintaxe Bash $ {var ## *.} é uma parte da expansão de parâmetro de shell inteligente que você pode fazer. Você pode encontrar mais informações no site do GNU .

    
por 22.08.2015 / 20:15
0

Obrigado por toda a ajuda, embora eu não tenha conseguido fazer com que algumas delas funcionassem.

Eu, no entanto, implementei com sucesso o código que encontrei em uma resposta a outra pergunta! ( link )

export DIR=./folder
if ls ${DIR}/*.RAW &>/dev/null
then
  echo "Yes!"
else
  echo "No!"
fi
    
por 22.08.2015 / 20:38
-1

Duas soluções Bourne Shell

Com o shell Bourne (que não suporta arrays, ou opções de shell como nullglob ou failglob ) você precisa contornar o fato de que uma saída diferente de zero status ou o próprio glob será retornado se um glob não for encontrado. Por exemplo:

if [ -n "'ls *.RAW 2> /dev/null'" ]; then
    echo "At least one RAW file found!"
else
    echo "No RAW files found."
fi

Em geral, não se deve confiar na saída do comando ls , mas isso é suficiente para o seu caso de uso e trabalha em torno das limitações do shell Bourne. Se você realmente deseja usar apenas os recursos internos do shell, é necessário usar a atribuição e testar explicitamente o glob em si como uma condição de erro. Por exemplo:

files=*.RAW
if [ "$files" = "*.RAW" ]; then
    echo "No RAW files found."
else
    echo "At least one RAW file found!"
fi
    
por 22.08.2015 / 20:31