Loop em um script até que o arquivo exista

3

Estou tentando fazer com que um script encontre um arquivo em / tmp chamado sleep.txt, mas ele continua em loop

Veja o que eu tenho:

#!/bin/sh

set -x
until [ $(ls -la | grep -w "sleep.txt" | wc -l) != 0 ];
do
        echo "Sleep.txt doesn't exist as of yet..."
done
        echo "Sleep.txt now exists!!!"
        sleep 2
exit
    
por Cidricc 16.02.2015 / 20:33

2 respostas

8

Este script não usa pesquisa. Em outras palavras, não faz verificações periódicas. Em vez disso, ele usa uma ferramenta, inotifywait , projetada para monitorar as alterações no sistema de arquivos.

Nesse script, inotifywait monitora o diretório atual ( . ). Toda vez que um arquivo é criado nesse diretório, inotifywait emite seu nome e o script verifica se ele corresponde a sleep.txt . Em caso afirmativo, anuncia a criação:

[ -e sleep.txt ] || while IFS= read -r fname
do_
    [ "$fname" = sleep.txt ] && break
done < <(inotifywait -m -q -e create -e moved_to --format %f .)

echo "Finally, sleep.txt now exists!!!"

Mais detalhes

As opções usadas para inotifywait têm os seguintes significados:

  • -m significa continuar monitorando o diretório. Em outras palavras, não pare na primeira vez que algo acontecer digno de ser relatado.

  • -q significa estar mais quieto que o normal.

  • -e create -e moved_to significa apenas o relatório no arquivo criado ou movido para este diretório.

  • --format %f informa para imprimir o nome do arquivo sempre que ocorrer um evento de criação de arquivo

  • . informa qual diretório monitorar. Um período, . , sempre significa o diretório atual.

Instalando inotifywait

Em sistemas semelhantes ao Debian, inotifywait faz parte de inotify-tools e pode ser instalado via:

apt-get install inotify-tools

MS Windows e OSX

inotifywait está disponível para sistemas Linux e também é executado no Cygwin.

Para ler sobre ferramentas semelhantes para o Windows, clique aqui .

Para obter informações sobre ferramentas semelhantes para o Mac OSX, clique aqui .

    
por 17.02.2015 / 06:25
6

Analisar ls não é uma boa ideia .

Em vez disso, você pode usar o teste -e para verificar se existe um arquivo:

#!/bin/sh

until [ -e sleep.txt ]; do
    echo "sleep.txt doesn't exist as of yet..."
    sleep 1
done

echo "sleep.txt now exists!!!"
sleep 2

Consulte man test para mais informações sobre o comando test .

    
por 16.02.2015 / 20:40