Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I want my cron-run reporting script to notify me in case there are updates for my packages. Is the a way to make apt-get give me the list of available updates but don't do anything more?

share|improve this question

10 Answers 10

The -u switch shows a list of packages that are available for upgrade:

# apt-get -u upgrade

From the apt-get man page:

-u
--show-upgraded
 Show upgraded packages; Print out a list of all packages that are to be upgraded. Configuration Item: APT::Get::Show-Upgraded.
share|improve this answer
21  
apt-get -u upgrade --assume-no if you don't want it to ask if you want them installed. Does this on 12.10. – slm Dec 17 '13 at 3:47
1  
I was hoping this could be done without root – ThorSummoner Feb 6 '15 at 17:33
6  
If you type "Y" and press Enter, this command will install updates. I would definitely recommend to add "-s", otherwise this answer is misleading – user1885518 Jun 17 '15 at 7:26
2  
This is a very wrong answer because (without additional options) the command waits for input and if the user enters the wrong input, the package are installed, which modifies the system which is not what the OP wants (just happened on my system) – Daniel Alder Nov 1 '15 at 13:11
1  
@ThorSummoner '-s' will do what you want & works without root – nevelis Dec 16 '15 at 23:47
apt-get --just-print upgrade

Is not read that easily, below is a perl one liner to parse apt-get's output:

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"}'

This should output something like:

PROGRAM: grub-pc INSTALLED: 1.99-21ubuntu3.1 AVAILABLE: 1.99-21ubuntu3.9

Hopefully it will help someone else,

share|improve this answer
1  
just for the laugh: apt-get -s upgrade| awk -F'[][() ]+' '/^Inst/{printf "Prog: %s\tcur: %s\tavail: %s\n", $2,$3,$4}' – tink May 17 '13 at 3:19
1  
It could also be much more nice looking, if use column like this: 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 – AntonioK Jul 14 '15 at 11:35

You can run

aptitude -F%p --disable-columns search ~U

or the undocumented

/usr/lib/update-notifier/apt-check -p; echo

Another method using an apt-get simulation:

apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'
share|improve this answer
    
This aptitude command worked great for me and did not require root – JamesCW 17 hours ago

Take a look at package "apticron":

apticron - Simple tool to mail about pending package updates

http://packages.debian.org/squeeze/apticron

share|improve this answer

Another option, inspired by enzotib :

aptitude search '~U' | wc -l

This command will use aptitude to output the new packages and then wc to just count the lines.

On a sidenote, I found that enzotib's solution without the single quotes around the ~U didn't work for me. (Wheezy, ZSH, aptitude 0.6.8.2)

Update :

With the new apt you can do now :

apt list --upgradable
share|improve this answer
apt-get update && apt-get -s upgrade

will list available updates without actually installing.

First command updates package index files before simulated (thus -s) upgrade is done. "-s" will do a simulated upgrade showing packets that would be installed but will not actually install anything.

On the contrary "-u" instead of "-s" would actually install after confirmation.

share|improve this answer
    
The simulate option can be triggered with any of -s, --simulate, --just-print, --dry-run, --recon, --no-act, recon and dry-run are my personal favorites. – ThorSummoner Dec 17 '15 at 17:24

I needed full version information on possible upgrades, so I used a modification of jasonwryan's answer:

apt-get -V -u upgrade

It's simple and IMO reasonably formatted output.

share|improve this answer

Just filter the output of

apt-get update && apt-get -s -V -u upgrade

to have only the preferred information in your log.

Most likely, you'll need the beautiful part after the line

...

The following packages will be upgraded:

...

that has few spaces in the beginning.

share|improve this answer
    
Hi and welcome to the site. As it stands, your answer is basically a rehash of existing ones and so does not add anything new. You could improve it by, for example, explaining how to filter the output, adding an explanation of what the various switches do etc. – terdon Nov 19 '14 at 17:29

Jet another on-liner, inspired by this answer:

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;

The output looks like this (colored):

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

If you dont want the short description use this one:

{ 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;

Output:

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)
share|improve this answer

After writing warning to @jasonwryan's answer, I want to provide my own solution:

apt-get dist-upgrade --assume-no

Unfortunately, this one doesn't work with debian wheezy and I had to check some lxc containers which are still not upgraded. This form will always work:

apt-get dist-upgrade </dev/null

Finally, I also wanted to reformat the output. I chose to change the call again (using --dry-run but ignoring all additional output) because it feels more safe:

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}
'

Returns:

The following packages have been kept back:
  iproute
The following packages will be upgraded:
  unzip
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.