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?
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?
Odpowiedzi:
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..pycpliki (skompilowane biblioteki Pythona), .elcpliki (skompilowane biblioteki Emacs Lisp) itp./var/lib/dpkg/info/*.list- powyższe zapytanie musiałoby zostać przepisane na podstawie innej zasady.
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.
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.
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)
find: argument list too long