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, seidentify
retornar um código de erro diferente de zero, o nome do arquivo será exibido emnames.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.