Não use a substituição de comando na saída de find
. Aqui tudo pode ser feito com find
:
find . -mtime 1 -type f ! -exec lsof -t {} \; -exec rm -f {} \; > /dev/null
Com algumas implementações find
(incluindo FreeBSD find
de onde vem e GNU find
), você pode usar -delete
em vez de -exec rm...
.
O motivo pelo qual você está recebendo um erro é que não há comando entre then
e else
e alguns shells (começando com o shell Bourne de onde vem essa sintaxe) requerem pelo menos um (e um comentário não é um comando). Note que é completamente arbitrário e não há razão para que essas camadas façam isso. yash
e zsh
não têm essa limitação ( if false; then else echo x; fi
e mesmo if false; then else fi
funcionam bem com eles).
Como outros já disseram, você pode usar um comando noop como :
(ou for nothing in; do nothing; done
) ou inverter a lógica com a palavra-chave !
(disponível em shells POSIX, mas não no shell Bourne (você encontrará que usando :
para isso era comum naquele shell)). mksh
e yash
suportam if false; then () else echo x; fi
(eu não confiaria nele, já que isso poderia mudar em versões futuras).
Outra abordagem é com:
lsof... || {
cmd1
cmd2
}
embora uma diferença seja o status geral de saída, que será o de lsof
se lsof
falhar.