Jak znaleźć pliki, które nie są własnością żadnego pakietu?

12

W moim systemie mam pliki, które nie należą do żadnego pakietu, są moje lub pochodzą z zainstalowanych programów skompilowanych make install. Jak mogę znaleźć wszystkie pliki, które nie należą do żadnego pakietu?

geaplaneta
źródło

Odpowiedzi:

10

W /var/lib/dpkg/infoto .listpliki tekstowe, które lista wszystkich plików zawartych w każdej zainstalowanej przez menadżera pakietów Debiana package¹.

Znalezienie wszystkich plików w systemie plików, które nie pasują do żadnego wpisu, można osiągnąć za pomocą czegoś naiwnego:

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

Zajmie to oczywiście bardzo dużo czasu, ponieważ cały system plików zostanie przeskanowany. Jeśli używasz różnych partycji dla katalogów systemowych (takich jak /usrlub /var), określ je po początkowej /.

Ostrzeżenie: nie obejmuje plików utworzonych przez skrypty pakietu. Na przykład:

  • /etc/hosts.allownie ma go nigdzie na liście, ale może pochodzić od libwrap0tego, który prawdopodobnie go utworzył, jeśli ten plik nie istniał w czasie instalacji pakietu.
  • Wiele plików jest kompilowanych podczas instalacji, na przykład .pycpliki (skompilowane biblioteki Pythona), .elcpliki (skompilowane biblioteki Emacs Lisp) itp.
Patrice Levesque
źródło
błądfind: argument list too long
naught101
@ naught101 Sugeruje to, że pasują pliki gazillion /var/lib/dpkg/info/*.list- powyższe zapytanie musiałoby zostać przepisane na podstawie innej zasady.
Patrice Levesque,
6

Bardziej wydajne wersja @ roztworu Patrice jest , za pomocą powłoki z obsługą do zastąpienia procesu ( bashAT & T ksh, zsh):

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

Podobnie jak rozwiązanie Patrice, zakłada, że ​​ścieżka do pliku nie zawiera znaków nowej linii.

Stéphane Chazelas
źródło
1
Czy korzystanie z locatebazy danych byłoby szybsze niż uruchomienie find? locate \* | grep -v "^/home/"- ma również tę zaletę, że może przeglądać /boot/i inne partycje systemowe.
naught101
3

Ponieważ otagowałeś swoje pytanie debianoczywistym wyborem, o którym jeszcze nie wspomniano, należy go użyć, cruft-ngjeśli nie potrzebujesz żadnej elastyczności lub cruftjeśli nie chcesz przeszukiwać całego systemu / umiejscowionegob.

stefanct
źródło
0

Możesz także użyć zastępowania procesów i grep& find. Zauważ, że grepsłuży on dwukrotnie do filtrowania tylko odpowiednich ścieżek, /var/lib/dpkg/infoaby zaoszczędzić kilka sekund, jeśli szukasz plików w określonym katalogu.

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)
Josef Kufner
źródło