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


9

Có cách nào để tìm ra tất cả các tệp trên một hệ thống nhất định không được cài đặt qua RPM không? Tôi hiểu rằng tôi có thể tự buộc mình sử dụng thứ gì đó như rpmquery -ftrong tập lệnh lặp qua tất cả các tệp trong hệ thống tệp, tuy nhiên tôi tự hỏi liệu có cách nào tiêu chuẩn để làm điều này cho các hệ thống dựa trên RPM (cụ thể là Fedora, mà tôi sử dụng tại Trang Chủ). Vì điều này đối với Fedora, nên sử dụng yumhoặc dnftìm hiểu điều này là tốt.

Nếu không có cách tiêu chuẩn để làm điều đó, có ai biết một số tập lệnh có sẵn để làm điều này không? Tôi không muốn phát minh lại bánh xe nếu tôi không cần.

PS Có một câu hỏi khác tương tự như vậy , nhưng đó là về Gentoo và Portage, vì vậy nó không hoàn toàn phù hợp.


Vì tò mò, trường hợp sử dụng thực tế sẽ là gì?
doktor5000

1
@ doktor5000 Tôi có một máy tính để bàn gia đình mà tôi đã thêm một số lượng lớn phần mềm của bên thứ 3 trong vài năm qua. Thay vì cố gắng theo dõi bằng tay từng tệp mà tôi đã cài đặt bên ngoài vòng / phút, thật tuyệt khi lấy danh sách các tệp đó để tôi biết phải sao chép thủ công, cài đặt lại khi tôi cập nhật hệ thống hoặc đơn giản là bỏ qua. Tôi gặp xui xẻo khi thử nâng cấp tại chỗ nếu Fedora, vì vậy tôi có xu hướng cài đặt lại hoàn toàn mới.
eestrada 16/2/2016

Vậy thì có lẽ việc giới hạn bản thân trước các gói vòng / phút không đi kèm với kho cơ sở sẽ dễ dàng hơn. Ngoài ra, phần mềm khác thường được cài đặt thành / usr / local theo mặc định hoặc vào / opt, điều này khá dễ kiểm tra vì không được sử dụng bởi các gói distro thông thường. Đối với các đường dẫn tiêu chuẩn như / usr / bin, / usr / share hoặc / usr / lib và tương tự, bạn có thể cần phải sử dụng một trong các phương thức scriptlet như được liên kết trong câu trả lời của tôi.
doktor5000

Câu trả lời:


5

đến bữa tiệc muộn một chút, nhưng hy vọng ai đó sẽ thấy điều này hữu ích:

find /usr/ -exec /bin/sh -c "rpm -qf {} &> /dev/null || echo {}" \;

Lệnh này thu thập thông tin trên hệ thống tệp và chạy rpm -qftrên nó. rpm -qfin gói tương ứng cho một tệp và may mắn có giá trị trả về là 0 nếu tìm thấy một và 1 khác.

Nếu bạn dũng cảm, bạn có thể buộc đầu ra | xargs rm -f, nhưng cá nhân tôi sẽ không dũng cảm như vậy. Hóa ra có rất nhiều thứ trong / usr không thực sự thuộc sở hữu của bất cứ thứ gì.


3

Theo như tôi biết, điều này là không thể đối với một số loại lệnh chuyên dụng, chỉ thông qua một chút kịch bản. TL; DR - xem các liên kết ở phía dưới. Và đối với các hệ thống dựa trên vòng / phút hoặc các trình quản lý gói dựa trên nhị phân khác, điều này không có ý nghĩa nhiều. Các trình quản lý gói như vậy thường là các máy dựa trên trạng thái nhằm theo dõi những thứ mà chúng tự cài đặt và không biết mọi thứ mà người dùng lẻn vào hệ thống "đằng sau lưng" của trình quản lý gói.

Nơi nào bạn sẽ vẽ đường cho các tệp không thuộc sở hữu của các tệp vòng / phút? Điều gì về các tệp tạm thời (think / tmp và / var / tmp) hoặc cache (think / var / cache) hoặc các tệp được tạo bởi người dùng (/ home hoặc / srv hoặc các điểm gắn kết do người dùng xác định khác).

Đối với các phân phối dựa trên nguồn, có thể cung cấp chức năng đó nếu trường hợp sử dụng giới hạn chúng trong các thư mục FHS được sử dụng bởi các gói "hệ thống" như / usr, / bin, / lib và tương tự, trái với ví dụ / usr / local hoặc / lựa chọn phần mềm của bên thứ 3.


Xem các câu hỏi tương tự sau đây cho scriptlets để làm những gì bạn yêu cầu:


3

Mỗi /superuser/555918/how-do-i-list-all-the-files-not-own-by-any-package-in-a-rpm-basing-system , lệnh sau là một cơ sở vững chắc cho những gì bạn cần:

comm -13 <(rpm -qla | sort) <(find / -type f | sort)

Customize hơn nữa bằng cách lọc các lệnh find để thư mục quan tâm (hoặc quy định cụ thể danh sách các thư mục thay vì /(ví dụ /{usr,bin}) hoặc loại trừ các thư mục như /proc, /dev, /home, và /tmp.


Toàn diện hơn: comm -13 <(rpm -qla | sort | uniq) <(find / -xdev \( -type f -o -type d -o -type l \) | sort) Danh sách này ( -l) các tệp trong tất cả các gói đã cài đặt ( rpm -qa) và sắp xếp chúng sau đó loại bỏ trùng lặp (vì một số thư mục được cung cấp bởi nhiều gói). Nó cũng tìm thấy tất cả các tệp trên phân vùng gốc (không đi vào các hệ thống tệp khác - -xdev) và trả về tất cả các tệp, thư mục và symlink ( \( -type f -o -type d -o -type l \)). Sau đó, nó sử dụng commđể so sánh, bỏ qua các mục chỉ trong danh sách vòng / phút ( -1) và các mục trong cả hai ( -3).
IBBoard

Cũng lưu ý rằng bạn có thể cần phải sử dụng sudotrên find để bạn có thể tìm thấy các tệp (đặc biệt là dưới / etc) mà chỉ root mới có thể truy cập.
IBBoard
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.