Aqui está o que eu uso
$ find . ! -exec sudo fuser -s "{}" 2>/dev/null \; -exec echo {} \;
Ele usa dois recursos interessantes de find
:
-
exec
s estão encadeados, da mesma forma que a operação bash &&
. Se o primeiro exec retornar um código de saída diferente de zero, o segundo exec não será chamado.
-
!
é uma operação inversa para o código de saída. fuser
retorna 1 para o arquivo não acessado e 0 para o arquivo acessado, portanto, precisamos invertê-lo para obter o que você deseja.
Observe que adicionei um sudo
ao fusor, para que ele possa localizar arquivos abertos por outros usuários. Sem isso, ele irá alegremente informar que o arquivo não está aberto, enquanto na realidade ele está apenas reportando que o arquivo não está aberto por um processo que você tem permissão para monitorar
Também vale a pena mencionar - obviamente chamar fuser é mais caro do que apenas verificar as informações do inode, portanto, se você tiver outros filtros de que goste, além de "é um arquivo aberto", aplique esses filtros ao find primeiro antes de fazer a verificação do fusor mais cara