Làm thế nào để tôi có được một danh sách các gói lỗi thời?


19

Tôi đang cố gắng tìm ra một danh sách các gói không còn khả dụng trong kho mà tôi đã kích hoạt. Máy trạm này đã trải qua khá nhiều phiên bản Ubuntu và đã có nhiều kho lưu trữ của bên thứ 3 được thêm và xóa. Tôi muốn có một danh sách các phần mềm mà tôi có từ các kho lưu trữ bị xóa này, vì vậy tôi có thể dọn sạch hoặc thêm lại các kho lưu trữ thích hợp.

Câu trả lời:


23
aptitude search '~o'

Aptitude có một số tìm kiếm rất mạnh có sẵn. Thật không may, cú pháp hơi khó sử dụng và bạn phải tìm hiểu kỹ trang này để tìm tài liệu, nhưng nó đáng giá.

phiên bản apt-show-cũng có thể hữu ích:

apt-show-versions | grep 'No available version'

1
xem một bài viết hay về các gói lỗi thời ở đây: raphaelhertzog.com/2011/02/07/ trên
Lluís

Một danh sách hữu ích khác được tạo bởiapt-show-versions | grep "newer than version in archive"
Sean

Tôi nghĩ apt-show-Phiên bản là tốt nhất đơn giản vì dòng aptitude cực kỳ phản trực quan để ghi nhớ. Mỗi lần tôi cần, tôi phải google nó / tra cứu / lưu nó / tạo tập lệnh / v.v.
j đối thủ

6

Để có danh sách các ứng dụng không có trong Kho lưu trữ đã đăng ký hoặc PPA, hãy làm điều này:

sudo apt-get install apt-show-versions
apt-show-versions | grep 'No available version'

Điều đó sẽ xuất văn bản như thế này:

app1 1.0.0.14 installed: No available version in archive
app23 0.3.6 installed: No available version in archive
app332 7.0.9377 installed: No available version in archive

Đối với tôi, điều này đã hoạt động và hiển thị ba ứng dụng tôi đã cài đặt bằng các gói DEB và không có sẵn trong Repo hoặc PPA.

Mặc dù vậy, hãy nhớ rằng không thể kiểm tra tất cả các chương trình, chỉ những chương trình đã trải qua dpkg. Chẳng hạn, một số ứng dụng được cài đặt bằng cách trích xuất chúng vào các thư mục chính xác hoặc các ứng dụng khác sử dụng thùng hoặc trình cài đặt độc lập. Vì vậy, cách tốt nhất là bạn nên tự mình giữ một danh sách các ứng dụng bạn đã cài đặt thông qua bất kỳ phương pháp nào khác ngoài APT.


Hoạt động cho tất cả các dpkggói cài đặt cục bộ của tôi . Một ngoại lệ. Nó liệt kê skype-bin, trong khi apt-cache policy skype-binhiển thị rõ ràng repo đối tác Canonical. Tôi không chắc chuyện gì đang xảy ra. Vấn đề đa quốc gia? Vẫn +1 cho apt-show-versions!
gertvdijk

aptitude gọi những gói 'lỗi thời' này. Xem bình luận viêm chron ở trên.
Henk Poley

5

Nếu bạn có năng khiếu sử dụng đã cài đặt,

aptitude search '?obsolete'

hoặc dạng ngắn của nó

aptitude search '~o'

Đây là một đầu ra mẫu

i A gcc-4.7-base - GCC, the GNU Compiler Collection (base package)
id  libdb4.7     - Berkeley v4.7 Database Libraries [runtime]
i   libudev0     - libudev shared library

Ký tự đầu tiên của mỗi dòng biểu thị trạng thái hiện tại của gói. Các trạng thái phổ biến nhất là:

  • p, có nghĩa là không có dấu vết của gói tồn tại trên hệ thống,
  • c, có nghĩa là gói đã bị xóa nhưng các tệp cấu hình của nó vẫn còn trên hệ thống,
  • i, có nghĩa là gói được cài đặt, và
  • v, có nghĩa là gói là ảo.

Ký tự thứ hai cho biết hành động được lưu trữ sẽ được thực hiện trên gói, nếu có, nếu không, một khoảng trống sẽ được hiển thị. Các hành động phổ biến nhất là:

  • i, có nghĩa là gói sẽ được cài đặt,
  • d, có nghĩa là gói sẽ bị xóa và
  • p, có nghĩa là gói và các tệp cấu hình của nó sẽ bị xóa.

Nếu ký tự thứ ba là A, gói được tự động cài đặt.

Để biết danh sách đầy đủ các cờ trạng thái và hành động có thể, hãy xem phần Truy cập thông tin gói trong hướng dẫn tham chiếu năng khiếu.


1
aptitude search ?obsoletecó thể hoạt động trong bash, nhưng bạn nên sử dụngaptitude search '?obsolete'
AB

bạn có thể thêm một số chi tiết về phân tích cú pháp đầu ra?
Anh Cả Geek

Là '? Lỗi thời' khác với '~ o'?
Sean

@Sean Không, chúng không khác nhau. ~ o là hình thức ngắn cho? thực sự lỗi thời.
Demis Palma

Các trích dẫn được phân tích bằng vỏ. Tôi nghĩ điều AB có nghĩa là bạn không nên vượt qua nhân vật kỳ lạ không được giải thích trên dòng lệnh bởi vì bạn không biết cái vỏ của bạn sẽ làm gì với chúng.
Sean

2

Bắt đầu với Ubuntu 19.10 cũng có thể chạy

apt list ?obsolete

để có được danh sách các gói lỗi thời.

Đối với bất kỳ bản phát hành nào, bạn có thể sử dụng Bash one-liner sau:

comm -23 <(dpkg-query -W -f '${db:Status-Abbrev}\t${Package}\n' | grep '^.[^nc]' | cut -f2 | sort) <(apt-cache dumpavail | sed -rn 's/^Package: (.*)/\1/p' | sort -u)

Không cần phải cài đặt các gói bổ sung cho việc này, cộng với việc này tương đối nhanh. Điều này cũng sẽ tìm thấy các gói được cài đặt một phần (nhưng sẽ không tìm thấy các gói chỉ còn lại các tệp cấu hình; có thể thay đổi dễ dàng). Lưu ý: điều này không quan tâm đến kiến ​​trúc của các gói.

Nếu bạn muốn bao gồm các gói có cài đặt phiên bản khác với các gói có sẵn từ kho, bạn có thể sử dụng một trong các cách sau:

Sử dụng apt hiện đại:

 apt list --installed | awk -F/ '/\[installed,local\]/{print $1}'

Một lựa chọn khác là chạy

ubuntu-support-status --show-unsupported

và đọc tên gói trong phần "Không còn có thể tải xuống:".


'danh sách apt - cài đặt thủ công | grep -v cosmic 'hiển thị dương tính giả. Câu trả lời này tốt hơn nhiều!
TamusJRoyce

1
@TamusJRoyce, vâng, tôi cho là như vậy ngay bây giờ sau khi chỉnh sửa.
jarno

1

Thêm thông tin để điều tra.

tình trạng hỗ trợ Ubuntu 
echo các gói "$ (sudo apt-mark showmanual | wc -l) được đánh dấu là 'cài đặt thủ công'."

... Ubuntu-support-status và apt-mark có thể yêu cầu cài đặt.


Không cần sử dụng sudovới apt-mark showmanual.
jarno

ubuntu-support-statusliệt kê số lượng các gói lỗi thời, nhưng không phải là tên gói.
jarno

1
Đọc kết quả củaubuntu-support-status --help
Hannu

Ồ, cảm ơn vì gợi ý.
jarno

0

Có thể có một cách sạch hơn, nhưng ngoài đỉnh đầu tôi có thể làm

dpkg -l | cut -f 3 -d ' ' > installed
xargs -n 1 --replace=X apt-cache search ^X$ < installed | cut -f 1 -d ' ' > available
diff installed available

Dọn dẹp vài dòng đầu tiên của installedtệp: nó sẽ có các tiêu đề.

Phần thưởng nếu bất cứ ai có thể sửa lỗi tô sáng cú pháp của tôi ...


2
nếu bạn định sử dụng đầu ra của dpkg -lđể lấy danh sách các gói đã cài đặt, bạn nên giới hạn kết quả ở các dòng có 'i' trong cột thứ hai, vì dpkg cũng sẽ liệt kê các gói không được cài đặt (có thể bị xóa nhưng không bị xóa) . như một ví dụ, việc thay đổi lệnh đầu tiên của bạn thành lệnh dpkg -l | grep '^.[^i]' | cut -f 3 -d ' ' sẽ trả về danh sách các gói KHÔNG được cài đặt. (nhưng đã từng)
hầm

1
Ngoài ra, apt-cache search someinstalledpackagesẽ trả lại một cái gì đó ngay cả khi gói không có sẵn từ repo, vì vậy tôi không tin rằng nó sẽ hoạt động.
hầm

1
@stew Tôi sẽ để nó ở đây để xem có ai đưa ra kết luận hay không, nhưng câu trả lời của bạn chắc chắn tốt hơn nhiều. +1 cho bạn.
Jeff Ferland

@stew dpkg -l | grep '^.[^i]' | cut -f 3 -d ' 'cũng in một số dòng tiêu đề.
jarno

Ngay cả khi câu trả lời này có hiệu quả, nó sẽ rất chậm vì nó sẽ chạy apt-cache searchriêng cho từng gói.
jarno

0

Như đã đề cập, tìm kiếm apt-get không phải là một phương pháp tốt để kiểm tra nếu một gói vẫn còn khả dụng. Bổ sung Tôi đã thêm mọi thứ vào chỉ một dòng:

for i in `dpkg -l | grep '^i' | awk '{ print $2 }'`; do apt-cache show $i > /dev/null || echo $i; done

Và tại saogrep '^i'
AB

@AB điểm tốt; điều đó không cho biết, nếu gói được cài đặt, nhưng hành động mong muốn của gói sẽ được cài đặt. Xem man dpkg-queryđể biết thêm thông tin.
jarno

Điều này rất chậm
jarno

apt-cache showkhông tốt cho việc kiểm tra nếu gói hàng có sẵn. Nếu bạn vô hiệu hóa kho lưu trữ tương ứng và không có kho lưu trữ được kích hoạt nào có nó, nó vẫn hiển thị gói.
jarno
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.