Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I accidentally removed my package accept_keywords file. There were only a few packages which I needed from ~amd64, but I can't remember them all. I could recover them if I had the list all the currently installed unstable packages. How do I do that?

share|improve this question

1 Answer 1

up vote 1 down vote accepted

We will use equery command to get this done.

equery y "PACKAGE NAME" will output information about package with keywords data. Unstable packages are marked as ~. So we need to write a script which will iterate list of installed packages and output if it is stable or not.

Output of single equery y "PACKAGE" looks like this:

test@test ~ $ equery y "portage"
Keywords for sys-apps/portage:
                 |                             | u   |  
                 | a a   a           p     s   | n   |  
                 | l m   r h i m m   p s   p   | u s | r
                 | p d a m p a 6 i p c 3   a x | s l | e
                 | h 6 r 6 p 6 8 p p 6 9 s r 8 | e o | p
                 | a 4 m 4 a 4 k s c 4 0 h c 6 | d t | o
-----------------+-----------------------------+-----+-------
[M]2.1.6.7_p1    | + + + o + + + ~ + + + + + + | # 0 | gentoo
    2.1.11.62    | + + + o + + + ~ + + + + + + | #   | gentoo
     2.1.12.2    | + + + o + + + ~ + + + + + + | #   | gentoo
        2.2.1    | + + + o + + + ~ + + + + + + | #   | gentoo
        2.2.6    | ~ ~ ~ o ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ | #   | gentoo
     [I]2.2.7    | + + + + + + + ~ + + + + + + | o   | gentoo
        2.2.8    | ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ | #   | gentoo
        2.2.8-r1 | ~ ~ ~ ~ + ~ ~ ~ ~ ~ ~ ~ ~ ~ | o   | gentoo
         9999    | o o o o o o o o o o o o o o | o   | gentoo

From this output we need to get row with [I] which means the package installed. Next we need to output keyword for your architecture (let's say it is amd64 - second column of the table). For this we can use awk (AWK's Manual page for reference). For single package it will look like this:

equery y "portage" | awk '/[I]/{print $4;}'

and output will be

+

while for unstable package the output would be

~

Now we need to do it with all installed packages. This script will help us:

#!/bin/bash

ALL_PKG=`equery list "*"`

for PKG in $ALL_PKG
do

 echo $PKG
 equery y "$PKG" | awk '/[I]/{print $4;}'

done

You need to adjust the awk's print number (awk '/[I]/{print $4;}') based on yours system architecture.

There are some exceptions which need to be handled individually. For example package winetricks gives following output:

test@test ~ $ equery y "winetricks"
Keywords for app-emulation/winetricks:
         |                             | u   |  
         | a a   a           p     s   | n   |  
         | l m   r h i m m   p s   p   | u s | r
         | p d a m p a 6 i p c 3   a x | s l | e
         | h 6 r 6 p 6 8 p p 6 9 s r 8 | e o | p
         | a 4 m 4 a 4 k s c 4 0 h c 6 | d t | o
---------+-----------------------------+-----+-------
20130629 | o ~ o o o o o o o o o o o ~ | # 0 | gentoo
20130707 | o ~ o o o o o o o o o o o ~ | o   | gentoo
99999999 | o o o o o o o o o o o o o o | o   | gentoo

There is no [I] symbol here, so awk will not output anything. If you will see no output or strange output for package - inspect it manually. There should be very small amount of such packages.

This version also outputs the list of unstable packages to unstable.txt

#!/bin/bash
ALL_PKG=`equery list "*"`

for PKG in $ALL_PKG
do

  echo $PKG
  export stb=$(equery y "$PKG" | awk '/[I]/{print $4;}' 2>&1)
  echo $stb
  if [[ "$stb" == "~" ]]; then echo $PKG >> unstable.txt; fi

done
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.