como listar arquivos que NÃO são abertos usando o comando find

3

Eu quero "listar" todos os arquivos que NÃO estão abertos, dentro de um determinado diretório usando o comando GNU find. Agora, posso listar os arquivos que estão abertos, mas não consigo descobrir uma maneira de fazer o inverso disso.

find /my/dir/* -exec lsof {} \;  

Alguma idéia de como isso pode ser feito?

    
por puffadder 14.02.2012 / 13:12

2 respostas

12
find /my/dir -type f | while read filename ; do fuser -s $filename || echo $filename ; done

Isso usa apenas para gerar uma lista de arquivos. Em seguida, o loop while percorre a lista de resultados, para cada resultado é executado fuser -s $filename , que sairá com sucesso se algo estiver usando o arquivo.

A parte || echo $filename significa "se o fusor falhou (o que significa que ninguém está usando o arquivo), ecoa o nome do arquivo"

    
por 14.02.2012 / 13:24
1

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

    
por 02.03.2015 / 05:36