Nie widziałem, żeby jakieś rozwiązania działały dla mnie, zainstalowałem sporo pakietów deb z dpkg i brakowało kilku elementów, których szczególnie szukałem.
Dość długa jedna wkładka, ale wygodna do skopiowania i wklejenia to:
export DPKG_INITIAL=$(mktemp) DPKG_INSTALLED=$(mktemp) DPKG_CUSTOM=$(mktemp) DPKG_DEPS=$(mktemp) zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > $DPKG_INITIAL ; awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > $DPKG_INSTALLED ; comm -23 installed initial > $DPKG_CUSTOM ; function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; } ; echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > $DPKG_DEPS ; comm -23 custom deps > my-packages ; rm $DPKG_INITIAL $DPKG_INSTALLED $DPKG_CUSTOM $DPKG_DEPS
Powyższe polecenie zapisuje listę pakietów do pliku w bieżącym katalogu roboczym o nazwie my-packages.
Wyjaśnienie
Najpierw zbudowałem listę pakietów, które stanowiły linię bazową pakietów wybranych podczas instalacji.
zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > initial
Następnie znajduje się długa lista elementów zainstalowanych ogólnie.
awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > installed
Następnie porównałem oba pliki initiali installedwymieniłem tylko te elementy, które nie były zainstalowane.
comm -23 installed initial > custom
Stamtąd chciałem odfiltrować zależności, tutaj ta metoda może ominąć niektóre pożądane pakiety, nie jest świadoma zależności, które są również jawnie zainstalowane.
Napisałem funkcję szybkiego bashu, aby skrócić te kroki w przetwarzaniu tych elementów.
function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; }
Następnie przekazałem każdą linię z mojego pliku customdo tej funkcji za pomocą xargs.
echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > deps
Kiedy miałem długą listę wszystkich możliwych zależności (nie jestem pewien co do każdej możliwej instrukcji), ponownie otrzymałem wiersze, które były unikalne dla jednego pliku.
comm -23 custom deps > manual
A moja skończona lista pakietów znajduje się teraz w pliku o nazwie manualdostępnej do przejrzenia.
somethingi niesomething-commontak dobrze.