como executar um shell embutido se encontrar determinados arquivos

2

Em geral, se quisermos executar um comando se find identificar arquivos correspondentes a determinadas especificações, podemos usar -exec . Mas no meu caso eu quero sair do shell / script se find encontrou uma correspondência e -exec não pode fazer isso. [Aparentemente, find ' -exec não pode ligar o bash funciona .

Por exemplo, em um script para remover uma árvore se e somente se ela contiver apenas diretórios vazios, eu gostaria de primeiro verificar a presença de qualquer não-diretório e abortar com uma mensagem de erro na primeira entrada inesperada.

Até agora, sempre que preciso fazer algo assim, coloco a saída em uma variável (possivelmente usando -quit com find ) e testando se ela está vazia ou não.

Então meu script parece:

#! /bin/sh
INTRUDER="$(find "$@" ! -type d -print -quit)"
if [ -n "$INTRUDER" ] ; then
    echo "Found non-dir $INTRUDER; leaving the arguments untouched"
    exit 1
fi
rm -R "$@"

Existe uma abordagem diferente / melhor do que isso? Por "melhor" quero dizer, menor para o código, mais portátil (se houver algum problema de portabilidade com o acima), etc. Por "diferente" quero dizer, evitando a variável extra e teste para o seu comprimento.

    
por jamadagni 19.09.2014 / 05:52

1 resposta

2

Este trabalhou para mim:

find "$@" ! -type d -exec kill -9 $$ \; -quit && rm -R "$@"
  • Se find sair normalmente (nada for encontrado) rm -R "$@" será executado.
  • Se find encontrar algo, o shell / script atual será eliminado ( $$ armazena o pid). A rm -part nunca será executada neste caso.
por 19.09.2014 / 07:53

Tags