Как найти файлы, которые не принадлежат ни одному пакету?


12

В моей системе есть файлы, которые не принадлежат ни одному пакету, они мои или из скомпилированных программ, установленных с make install. Как я могу найти все файлы, которые не принадлежат ни одному пакету?

Ответы:


10

В /var/lib/dpkg/infoэто .listтекстовые файлы, список все файлы , содержащиеся в каждом package¹ установлен через менеджер пакетов Debian.

Найти все файлы в файловой системе, не соответствующие ни одной записи, можно с помощью чего-то наивного:

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

Это, очевидно, займет очень много времени, так как будет проверена вся файловая система. Если вы используете разные разделы для системных каталогов (например, /usrили /var), укажите их после начальных /.

Предупреждение: это не включает файлы, созданные скриптами пакета. Например:

  • /etc/hosts.allowнигде не указан, но это может произойти из-за того, libwrap0что возможно его создал, если этот файл не существовал во время установки пакета.
  • Многие файлы компилируются во время установки, например, .pycфайлы (скомпилированные библиотеки Python), .elcфайлы (скомпилированные библиотеки Emacs Lisp) и т. Д.
  • ...

ошибкаfind: argument list too long
naught101

@ naught101 Это говорит о том, что есть соответствие gazillion файлов /var/lib/dpkg/info/*.list- вышеупомянутый запрос должен быть переписан по другому принципу.
Патрис Левеск

6

Более эффективная версия решения @ Patrice , использующая оболочку с поддержкой подстановки процессов ( bash, AT & T ksh, zsh):

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

Как и решение Патриса, оно предполагает, что ни один путь к файлу не содержит символов новой строки.


1
Будет ли использование locateбазы данных быстрее, чем работа find? locate \* | grep -v "^/home/"- также имеет преимущество просмотра /boot/и других системных разделов.
naught101

2

Поскольку вы пометили свой вопрос debianочевидным выбором, который еще не упомянут, это использовать его, cruft-ngесли вам не требуется гибкость или cruftесли вы не хотите осуществлять поиск по всей системе / расположенному b.


0

Вы также можете использовать процесс замены & grep& find. Обратите внимание, что grepдважды используется для фильтрации только соответствующих путей, /var/lib/dpkg/infoчтобы сэкономить несколько секунд, если вы ищете файлы в определенном каталоге.

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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.