Tìm tệp không được cài đặt bởi trình quản lý gói


8

Tôi muốn nhận danh sách tất cả các tệp trong hệ thống Gentoo Linux của tôi chưa được trình quản lý gói (Portage) cài đặt. Điều này là do tôi muốn giữ cho hệ thống của mình sạch nhất có thể, loại bỏ tất cả các tệp vô dụng nằm xung quanh.

Hãy để tôi nói cho bạn biết những gì tôi đã cố gắng cho đến bây giờ. Trước hết, tôi tạo danh sách tất cả các tệp thuộc về một số gói được theo dõi bởi Portage:

equery files "*" | sort | uniq > portage.txt

Sau đó, tôi tạo danh sách tất cả các tệp trên hệ thống của mình, ngoại trừ những tệp mà tôi không quan tâm:

find / \( -path /dev -o -path /proc -o -path /sys -o -path /media \
          -o -path /mnt -o -path /usr/portage -o -path /var/db/pkg \
          -o -path /var/www/localhost/htdocs -o -path /lib64/modules \
          -o -path /usr/src -o -path /var/cache -o -path /home \
          -o -path /root -o -path /run -o -path /var/run -o -path /var/tmp \
          -o -path /var/log -o -path /tmp -o -path /etc/config-archive \
          -o -path /usr/local/portage -o -path /boot \) -prune \
          -o -type f | sort | uniq > all.txt

Cuối cùng, tôi nhận được danh sách tất cả các tệp không được Portage theo dõi:

comm -13 portage.txt all.txt > extra.txt

Một số thống kê:

wc -l portage.txt all.txt extra.txt
  127724 portage.txt
   78371 all.txt
    8438 extra.txt

Như bạn thấy tôi vẫn nhận được hơn tám nghìn tệp bổ sung. Tôi muốn giảm số lượng đó, để tập trung hơn vào các tệp thực sự cần phải xóa.

Tôi nhận thấy rằng extra.txtcó hàng ngàn tệp trong một số ít thư mục, chẳng hạn như /usr/lib64/gcc, /usr/lib64/python2.7/usr/lib64/python3.2. Các /usr/lib64/gcc/x86_64-pc-linux-gnu/4.6.3/crtbegin.otập tin, ví dụ, không phải là portage.txtbởi vì, ở vị trí của nó, có /usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/crtbegin.o. Trên hệ thống của tôi /usr/liblà một liên kết tượng trưng đến /usr/lib64. Vì vậy, có vẻ như tôi cần xử lý đúng các liên kết tượng trưng để có kết quả tốt hơn. Có lẽ bằng cách thêm vào portage.txttất cả các tập tin họ trỏ đến. Tôi thực sự không biết làm thế nào để làm điều đó.

Ngoài ra, tại sao portage.txtlớn hơn all.txt? Không nên ngược lại vì các tệp được theo dõi bởi Portage là tập hợp con của tất cả các tệp trong hệ thống của tôi?

Cuối cùng, tôi có quên bất kỳ vị trí nào khác trong findlệnh cũng nên được loại trừ không?


1
"Điều này là do tôi muốn giữ cho hệ thống của mình sạch nhất có thể, loại bỏ tất cả các tệp vô dụng nằm xung quanh." - là thời gian của riêng bạn mà bạn đã dành cho việc đó rẻ hơn so với lãng phí dung lượng đĩa megabyte? :)
poige

Chà, tôi nên nói rằng đó cũng là để tìm các tệp thuộc về một gói chưa được cài đặt thông qua trình quản lý gói. Tôi cần một chương trình nhưng không có ebuild nào gần đây và tôi chưa học cách viết ebuild đúng cách.
Francesco Turco

Điều này có thể hữu ích: us.generation-nt.com/answer/ trên
ed.

Câu trả lời:


2

Những gì bạn đang tìm kiếm có thể là qfile. Nó là một phần của app-portage/portage-utilsgói và cung cấp tùy chọn -ohoặc --orphans. Bạn có thể sử dụng một cái gì đó như

find /usr/bin | xargs -I{} qfile -o {}

để có được một danh sách các tập tin mồ côi trong /usr/bin.

Lưu ý: Đáng buồn thay, qfiletrong phiên bản ổn định hiện tại của portage-utils, không hỗ trợ readin từ stdin và giải pháp được đề cập trong trang man của qfile qfile -o $(find /usr/bin)không hoạt động nếu tập kết quả tìm thấy lớn, do đó chúng tôi phải làm việc xung quanh nó một chút, sử dụng xargs.

BTW, đây không phải là thứ mà bản thân tôi nghĩ ra, nhưng tôi đã tìm thấy nó ở các chủ đề của Gossamer, một bình luận của yvasilev .


Gentoo không sử dụng trình quản lý gói Debian.
vonbrand

1
Thật. Gentoo sử dụng portage. Giống như câu hỏi ban đầu được nêu rõ ràng. Ai muốn biết cách tìm các tệp mồ côi trên hệ thống Debian?
luttztfz

0

IIRC, gentoo lưu trữ thông tin gói trong văn bản thuần túy (/ var / db / có lẽ), tìm kiếm trực tiếp có thể chậm.

Cách tốt nhất để làm như vậy là tạo một cơ sở dữ liệu sqlitedatabase (hoặc bất kỳ db nào) cho tất cả các tệp gói, sau đó liệt kê tất cả các tệp trên hệ thống của bạn, tìm kiếm từng cái một, nếu không tìm thấy, nó không thuộc về portage .


0

Tôi đã cố gắng khắc phục sự cố liên quan đến symlink portage.txtbằng cách chạy lệnh sau:

equery files '*' | while read i; do readlink -e "${i}"; done | sort | uniq \
       > portage.txt

Điều này phục vụ để đưa vào portage.txtcác tập tin symlink trỏ đến, và không phải chính các liên kết tượng trưng. Điều này là cần thiết bởi vì findlệnh tạo ra all.txtkhông liệt kê bất kỳ liên kết tượng trưng nào, mà chỉ là các tệp mà chúng trỏ đến, do đó sẽ có rất nhiều thông tin sai. Đó là một lệnh khá chậm, vì nó chạy readlinktrên hàng ngàn tệp, nhưng tôi không thể tìm ra giải pháp nào tốt hơn. Bất kỳ đề nghị đều được chào đón.

Một điều tôi hiểu (điều này dễ hơn) là tại sao portage.txtlại lớn hơn all.txt. Điều này chủ yếu là do thực tế là tôi đã cắt xén /usr/srcthư mục và tất cả các tệp bên dưới từ kết quả của findlệnh, nhưng equeryliệt kê chúng bất kể.

Điều cuối cùng tôi đã làm, ngay cả khi đây không phải là trong câu hỏi, sẽ lờ Python thứ (chủ yếu là __pycache__tập tin và các tập tin với .pychoặc .pyohậu tố):

grep '\(\.cpython-32\)\?\.py[co]$\|/__pycache__' candidates.txt \
     > candidates-bytecode.txt
sed -e 's/\(\.cpython-32\)\?\.py[co]$/.py/' \
    -e 's/\/__pycache__//' \
    candidates-bytecode.txt | sort | uniq \
    > candidates-bytecode-source.txt
comm -23 candidates-bytecode-source.txt portage.txt \
     > orphaned-bytecode.txt

Bằng cách này, tôi theo dõi nguồn gốc của tất cả các công cụ Python và kiểm tra xem nó có trong đó không portage.txt. Như bạn có thể thấy tôi đã viết cùng một biểu thức chính quy hai lần, một cho greplệnh và một cho sedlệnh, nhưng có lẽ nó có thể được thực hiện chỉ trong một bước duy nhất.


Nó có thể sẽ nhanh hơn rất nhiều , chỉ bằng cách sử dụng cat /var/db/pkg/*/*/CONTENTS | sed -r 's/^... //; s/ ([0-9a-f]+ )[0-9]+$//; s/ -> .*$//'trực tiếp, thay vì Python chậm đáng kinh ngạcequery files '*'
Evi1M4chine
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.