Ответы:
В /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) и т. Д./var/lib/dpkg/info/*.list
- вышеупомянутый запрос должен быть переписан по другому принципу.
Более эффективная версия решения @ Patrice , использующая оболочку с поддержкой подстановки процессов ( bash
, AT & T ksh
, zsh
):
(
export LC_ALL=C
comm -23 <(find / -xdev -type f | sort) \
<(sort -u /var/lib/dpkg/info/*.list)
)
Как и решение Патриса, оно предполагает, что ни один путь к файлу не содержит символов новой строки.
locate
базы данных быстрее, чем работа find
? locate \* | grep -v "^/home/"
- также имеет преимущество просмотра /boot/
и других системных разделов.
Вы также можете использовать процесс замены & 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)
find: argument list too long