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/info
to .list
pliki 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 /usr
lub /var
), określ je po początkowej /
.
Ostrzeżenie: nie obejmuje plików utworzonych przez skrypty pakietu. Na przykład:
/etc/hosts.allow
nie ma go nigdzie na liście, ale może pochodzić od libwrap0
tego, który prawdopodobnie go utworzył, jeśli ten plik nie istniał w czasie instalacji pakietu..pyc
pliki (skompilowane biblioteki Pythona), .elc
pliki (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 ( bash
AT & 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.
locate
bazy 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 grep
służy on dwukrotnie do filtrowania tylko odpowiednich ścieżek, /var/lib/dpkg/info
aby 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