bash: tratamento de erros em find -exec

4

Eu estava usando este pequeno script para encontrar imagens malformadas:

find -name '*.jpg' -exec identify -format "%f\n" {} \; 2>errors.txt

Funcionou bastante bem, mas agora preciso modificá-lo um pouco. Em vez de descarregar o stderr para o errors.txt, eu quero despejar o nome do arquivo (% f) da imagem que acionou o erro. Ou seja, eu quero uma lista dos arquivos de imagem malformados em errors.txt em vez de uma lista de mensagens de erro.

Eu tentei adicionar || echo "% f" > > errors.txt para a parte -exec, mas isso não funcionou. Qual seria a melhor maneira de fazer isso?

    
por Phll 11.04.2015 / 22:05

3 respostas

6

Isso encontra imagens malformadas e armazena seus nomes em names.txt :

find -name '*.jpg' -exec bash -c 'identify "$1" &>/dev/null || echo "$1">>names.txt' none {} \;

Como funciona

  • find -name '*.jpg'

    Isso inicia find como de costume.

  • -exec bash -c 'identify "$1" &>/dev/null || echo "$1" >>names.txt' none {} \;

    Isso executa identify em cada arquivo e, se identify retornar um código de erro diferente de zero, o nome do arquivo será exibido em names.txt .

    bash -c '...' none {} faz com que um shell bash execute o comando nas aspas com o nome do arquivo em {} atribuído ao argumento posicional $1 .

    Para os curiosos, a string none é atribuída a $0 . $0 não é usado a menos que bash gere um erro, caso em que ele aparecerá na mensagem de erro como nome do programa .

Discussão

I tried adding || echo "%f" >> errors.txt to the -exec portion, but that didn't work. What would be the best way to do this?

A sutileza é que || precisa operar no comando identify . Para fazer isso, precisamos colocar identify em um shell, usando bash -c como mostrado acima.

    
por 11.04.2015 / 22:15
2
find . -name '*.jpg' -exec sh -c '
  for file do
    if identify "$file"; then
      printf "%s\n" "$file" >&3
    else
      printf "%s\n" "$file" >&4
    fi
  done' sh {} + 3> good 4> bad > /dev/null 2>&1
    
por 11.04.2015 / 22:15
1

Então você quer gostar ...

find . -name '*.jpg'  \
       ! -exec identify -silent {} \; \
       -print 2>/dev/null >errors.txt
    
por 11.04.2015 / 23:26

Tags