Como encontrar arquivos que não pertencem a nenhum pacote?


12

No meu sistema, tenho arquivos que não pertencem a nenhum pacote, eles são meus ou de programas compilados instalados com make install. Como posso encontrar todos os arquivos que não pertencem a nenhum pacote?

Respostas:


10

Em /var/lib/dpkg/infosão .listarquivos de texto que lista todos os arquivos contidos em cada package¹ instalado através do gerenciador de pacotes do Debian.

Encontrar todos os arquivos no sistema de arquivos que não correspondam a nenhuma entrada pode ser alcançado com algo ingênuo como este:

find / -xdev -type f \( -exec grep -xq "{}" /var/lib/dpkg/info/*.list \; -or -print \)

Obviamente, isso levará muito tempo, pois todo o sistema de arquivos será verificado. Se você usar partições diferentes para diretórios do sistema (como /usrou /var), especifique-as após a inicial /.

Aviso: Isso não inclui arquivos criados por scripts de pacote. Por exemplo:

  • /etc/hosts.allownão está listado em nenhum lugar, mas pode vir do libwrap0que possivelmente o tenha criado, se esse arquivo não existisse no momento da instalação do pacote.
  • Muitos arquivos são compilados durante a instalação, por exemplo, .pycarquivos (bibliotecas Python compiladas), .elcarquivos ( bibliotecas Emacs Lisp compiladas), etc.
  • ...

errofind: argument list too long
naught101 16/08

@ naught101 Isso sugere que há um zilhão de arquivos correspondentes /var/lib/dpkg/info/*.list- a consulta acima precisaria ser reescrita sob outro princípio.
Patrice Levesque

6

Uma versão mais eficiente da @ solução de Patrice , usando um shell com suporte para substituição de processo ( bash, AT & T ksh, zsh):

(
  export LC_ALL=C
  comm -23 <(find / -xdev -type f | sort) \
           <(sort -u /var/lib/dpkg/info/*.list)
)

Como a solução de Patrice, ela assume que nenhum caminho de arquivo contém caracteres de nova linha.


1
Usar o locatebanco de dados seria mais rápido do que em execução find? locate \* | grep -v "^/home/"- também tem o benefício de procurar /boot/e outras partições do sistema.
naught101

2

Como você marcou sua pergunta com debiana opção óbvia ainda não mencionada, ela deve ser usada cruft-ngse você não precisar de flexibilidade ou cruftse não quiser pesquisar em todo o sistema / localizadob.


0

Você também pode usar a substituição do processo & grep& find. Observe que ele grepé usado duas vezes para filtrar apenas caminhos relevantes /var/lib/dpkg/infoe economizar alguns segundos se você estiver procurando por arquivos em um determinado diretório.

dir="/lib/x86_64-linux-gnu"
find "$dir" -type f \
| grep -v -x -F -f \
    <(find '/var/lib/dpkg/info' -name '*.list' -print0 \
       | xargs -0 grep -h -F "^$dir" \
       | sort -u)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.