Câu trả lời:
Đối với các phiên bản hiện đại, apt
có một công tắc cụ thể cho việc này:
apt list --upgradable
Đối với apt-get
lệnh cũ , -u
công tắc hiển thị danh sách các gói có sẵn để nâng cấp:
# apt-get -u upgrade --assume-no
Từ apt-get
trang người đàn ông :
-u
- Hiển thị các gói nâng cấp; In ra một danh sách tất cả các gói sẽ được nâng cấp. Mục cấu hình: APT :: Get :: Show-Upgraded.
--assume-no Tự động "không" cho tất cả các lời nhắc. <== Để ngăn nó bắt đầu cài đặt
-u
là một tùy chọn mặc định củaapt-get
apt-get --just-print upgrade
Không dễ đọc, bên dưới là một lớp lót để phân tích đầu ra của apt-get:
apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "PROGRAM: $1 INSTALLED: $2 AVAILABLE: $3\n"}'
Điều này sẽ xuất ra một cái gì đó như:
PROGRAM: grub-pc INSTALLED: 1.99-21ubuntu3.1 AVAILABLE: 1.99-21ubuntu3.9
Hy vọng nó sẽ giúp người khác,
column
như thế này:apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "PROGRAM: $1 INSTALLED: $2 AVAILABLE: $3\n"}' | column -s " " -t
Một lựa chọn khác, lấy cảm hứng từ enzotib:
aptitude search '~U' | wc -l
Lệnh này sẽ sử dụng aptitude để xuất các gói mới và sau đó wc để chỉ đếm các dòng.
Trong một sidenote, tôi thấy rằng giải pháp của enzotib mà không có trích dẫn nào xung quanh ~ U không hiệu quả với tôi. (Wheezy, ZSH, năng khiếu 0.6.8.2)
Cập nhật:
Với apt mới bạn có thể làm ngay bây giờ:
apt list --upgradable
Đơn giản nhất là:
apt list --upgradable
Bạn có thể chạy
aptitude -F%p --disable-columns search ~U
hoặc không có giấy tờ
/usr/lib/update-notifier/apt-check -p; echo
Một phương pháp khác sử dụng apt-get
mô phỏng:
apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'
dist-upgrade
nhưng không mất một số gói cần thiết để sử dụng aptitude
. aptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }')
đã lừa
Hãy xem gói "apticron":
apticron - Công cụ đơn giản để gửi thư về việc cập nhật gói đang chờ xử lý
Apticron là một tập lệnh đơn giản gửi email hàng ngày về các bản cập nhật gói đang chờ xử lý, chẳng hạn như cập nhật bảo mật, xử lý đúng các gói được giữ cả bởi DSelect và aptitude.
apt-get update && apt-get -s upgrade
sẽ liệt kê các bản cập nhật có sẵn mà không thực sự cài đặt.
Lệnh đầu tiên cập nhật các tệp chỉ mục gói trước khi nâng cấp mô phỏng (do đó -s) được thực hiện. "-s" sẽ thực hiện nâng cấp mô phỏng hiển thị các gói sẽ được cài đặt nhưng thực tế sẽ không cài đặt bất cứ thứ gì.
Ngược lại, "-u" thay vì "-s" sẽ thực sự cài đặt sau khi xác nhận.
-s, --simulate, --just-print, --dry-run, --recon, --no-act
, điều chỉnh và chạy khô là sở thích cá nhân của tôi.
Chỉ cần lọc đầu ra của
apt-get update && apt-get -s -V -u upgrade
để chỉ có thông tin ưa thích trong nhật ký của bạn.
Rất có thể, bạn sẽ cần phần đẹp sau dòng
...
Các gói sau sẽ được nâng cấp:
...
có ít khoảng trống ở đầu
Máy bay phản lực khác, lấy cảm hứng từ câu trả lời này :
function a { read input;dpkg -l ${input} | grep " ${input} " | awk '{$1=$2=$3=$4="";print $0}' | sed 's/^ *//';unset input;};{ apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "$1 (\e[1;34m$2\e[0m -> \e[1;32m$3\e[0m)\n"}';} | while read -r line; do echo -en "$line $(echo $line | awk '{print $1}' | a )\n"; done;
Đầu ra trông như thế này (màu):
locales (2.13-38+deb7u7 -> 2.13-38+deb7u8) Embedded GNU C Library: National Language (locale) data [support]
linux-headers-3.2.0-4-amd64 (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2) Header files for Linux 3.2.0-4-amd64
linux-headers-3.2.0-4-common (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2) Common header files for Linux 3.2.0-4
sudo (1.8.5p2-1+nmu1 -> 1.8.5p2-1+nmu2) Provide limited super user privileges to specific users
Nếu bạn không muốn mô tả ngắn, hãy sử dụng mô tả này:
{ apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "$1 (\e[1;34m$2\e[0m -> \e[1;32m$3\e[0m)\n"}';} | while read -r line; do echo -en "$line\n"; done;
Đầu ra:
locales (2.13-38+deb7u7 -> 2.13-38+deb7u8)
linux-headers-3.2.0-4-amd64 (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2)
linux-headers-3.2.0-4-common (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2)
sudo (1.8.5p2-1+nmu1 -> 1.8.5p2-1+nmu2)
apt-get update > /dev/null && apt-get --just-print upgrade | grep "Inst "
là đơn giản nhất cho các email cron; không có người dùng lặp lại, và nếu không có bản cập nhật thì không có đầu ra.
Sau khi viết cảnh báo cho câu trả lời của @ jasonwryan, tôi muốn cung cấp giải pháp của riêng mình:
apt-get dist-upgrade --assume-no
Thật không may, cái này không hoạt động với debian wheezy và tôi đã phải kiểm tra một số container lxc vẫn chưa được nâng cấp. Hình thức này sẽ luôn hoạt động:
apt-get dist-upgrade </dev/null
Cuối cùng, tôi cũng muốn định dạng lại đầu ra. Tôi đã chọn thay đổi cuộc gọi một lần nữa (sử dụng --dry-run
nhưng bỏ qua tất cả đầu ra bổ sung) vì cảm thấy an toàn hơn:
apt-get --dry-run dist-upgrade | awk '
BEGIN{p=0}
/^The/{p=1;t=$0}
/no longer required/{p=0}
#optional: /been kept back/{p=0}
p && t{print t;t=""}
/^ / && p{print $0}
'
Trả về:
The following packages have been kept back:
iproute
The following packages will be upgraded:
unzip
apt-check
có lẽ là phương pháp kịch bản hiệu quả nhất.
/usr/lib/update-notifier/apt-check 2>&1 | cut -d ';' -f 1
Một sửa đổi rất nhỏ chỉ cho bạn thấy các bản cập nhật bảo mật.
/usr/lib/update-notifier/apt-check 2>&1 | cut -d ';' -f 2
Là một biến thể tôi sử dụng như sau:
apt-get -V -s dist-upgrade \
|grep -E "^ .*=>.*" \
|awk 'BEGIN {
ul=sprintf("%*s",40,""); gsub(/ /,"-",ul);
printf "%-30s %-30s %-30s\n", "Package", "Installed", "Available";
printf "%-30.30s %-30.30s %-30.30s\n", ul, ul, ul;
}
{
printf "%-30s %-30s %-30s\n",
$1,
substr($2,2),
substr($4,1,length($4)-1)
}'
Dán nó vào một tập lệnh có tên apt-updates
và sau đó bạn có thể gọi apt-updates
để có được danh sách tất cả các bản cập nhật bất kể người dùng.
Bạn vẫn cần phải gọi apt-get update
với quyền truy cập đặc quyền.
Có apt-show-versions
công cụ. Để hiển thị các bản cập nhật có sẵn chạy:
apt-show-versions -u
Tôi thích sử dụng cái này:
apt-get -qq update && apt-get -qq -s upgrade
Bạn nhận được một đầu ra như thế này:
Inst linux-base [3.5] (4.5~deb8u1 Debian-Security:8/oldstable [all])
Conf linux-base (4.5~deb8u1 Debian-Security:8/oldstable [all])
nếu có bản cập nhật có sẵn, và không có nếu không có. Bằng cách này, bạn có thể chỉ cần ghép nó với một giải pháp giám sát.