手動でインストールされたパッケージを見つける方法


48

コンピューターにUbuntu 10.10をインストールし、apt-getを使用していくつかのソフトウェアをインストールしました。先週、すべてを壊し、ゼロから始めたばかりで、ソフトウェアを再インストールする必要があります。手動でインストールしたすべてのパッケージのリストを作成する方法はありますか?

のようにリストを提供しtexlive, ...、そうではなくtexlive, texlive-dep1, textlive-dep2, ...、すべての標準パッケージが削除されますか?

私が削除した通常のインストールからどのプログラムをどういうわけか理解できたら、それも素晴らしいでしょう!


更新2015-05-23:システムの構成管理としてAnsibleを使用するようになりました。そこで、インストールするパッケージを指定します。これは目標を果たし、すべてのプログラムを新しいシステムにインストールすることで、さらに良くなります。したがって、この質問は、いくつかの軽い構成管理への入り口かもしれません。

回答:


24

この提案では、古いインストールがまだ起動すると仮定しています!

1セットのパッケージを別のマシンに複製するには:

システムAで、次を実行します。

dpkg --get-selections | grep -v deinstall > my-selections

my-selectionsファイルをシステムBに移動します。

システムBで、次を実行します。

dpkg --set-selections < my-selections

その後:

sudo apt-get dselect-upgrade

重要な注意:非標準のリポジトリやPPAからパッケージをインストールした場合、アップグレードを実行する前/etc/apt/sources.list/etc/apt/sources.list.d/、システムAからシステムBにコンテンツをコピーすることもできます。

を使用dpkgして、削除したものを確認することもできます(注:これには、手動でインストールおよび削除したパッケージも含まれます)。

dpkg --get-selections | grep deinstall

ターミナルで結果を確認するか、もちろんファイルにリダイレクトすることができます。


9
すべてのパッケージのリストを取得したいのですが、明示的にインストールしたパッケージの名前のみを持ちたいです。それだけではsomethingありませんsomething-common
マーティンUeding

6
ええ、これは便利ですが、質問が求めることは行いません。
Timmmm

3
これを行うと、プログラムを削除しても、自動インストールされた依存関係がクリーンアップされません。なぜ、質問者が具体的に彼が望んでいないと言ったことをする答えを人々が投票するのですか?
jbo5112

20

superuser.comのこのスレッドは、次のソリューションを提供します。

aptitude search '?installed ?not(?automatic)'

2
これは私にはうまくいきません。インストールされているすべてのもの、または明らかに私が明示的に要求したものよりも多くのものをリストするだけです。
Timmmm

でインストールしたすべてのものapt-getとその依存関係が一覧表示されます。したがって、たとえば、あなたがインストールした場合aptitude、それはまた、一覧表示されますapt-xapian-index aptitude-common libboost-iostreams1.54.0 libclass-accessor-perl libcwidget3 libept1.4.12 libio-string-perl libparse-debianchangelog-perl libsigc++-2.0-0c2a libsub-name-perl libtimedate-perl libxapian22 python-chardet python-debian python-six python-xapian
Runemoro

10

aptログが/ var / log / aptにある場合、次のように機能します。

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install"

または、出力内の反復的なジャンクの一部を取り除きたい場合:

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install" \
  | cut -f4- -d" " | sort | uniq

6

apt-markを使用できますが、debfosterをお勧めします

sudo apt-get install debfoster
sudo debfoster

これにより、インストールされているすべてのパッケージが検査され、どのパッケージが他のパッケージをインストールしたままにしているかがわかります。

texlive-full is keeping the following 161 packages installed:
  cm-super cm-super-minimal context doc-base dvipng feynmf
  fonts-gfs-artemisia fonts-gfs-baskerville fonts-gfs-bodoni-classic
  ...
Keep texlive-full? [Ynpsiuqx?], [H]elp:

各質問に「y」と答えると(Enterを押してすばやく移動します)、debfosterはパッケージリストを収集し、ファイルに1行ずつ書き込みます。デフォルトでは、これは/var/lib/debfoster/keepersです。次のようになります。

gnome-do
texlive-full
...

/etc/debfoster.confこのリストを置くようにdebfoster viaを設定し、etckeeperで/etc/debfoster-keepersファイルを追跡して、履歴とバックアップを保持します。ここでの答えは、改行で区切られたテキストファイルからパッケージのリストをインストールする方法を示しています。

sudo apt-mark manual $(cat debfoster-keepers)

ここでの制限に注意してください。パージしたパッケージの前には「-」が付いています。したがって、apt-markを呼び出す前にこれらの行を削除する必要があります。

にもかかわらずdebfosterのウェブサイトは、 debfosterは適性の賛成で廃止されていることを言う、私はdebfosterの迅速かつ簡単な構成を好みます。これにより、パッケージデータベースの中央に移動し、物事を整理して、自動および手動パッケージをより明確にすることができます。

debfosterプロンプトで「h」と入力して、オプションを説明します。「?」と入力します パッケージの説明を参照してください。ここのハウツーは役に立つかもしれません。


5
comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

手動でインストールされたすべてのパッケージを提供します(システムパッケージではなく、依存関係ではありません)。例については示してbuild-essentialいますが、示していませんgcc


3

apt- *ツールの使用を好む人のために、クエリの実行と手動/自動状態の変更の両方を可能にするapt-markユーティリティがあります。

apt-mark showmanual

興味のあるパッケージのパターンを指定することもできます:

apt-mark showmanual qemu\*

これがチケットです。
ジョンフォンノイマン

2

私はついにそれを手に入れました:

outfile="$(mktemp)"
pattern='(\[INSTALLIEREN\]|\[INSTALL\])'

if [[ -f "/var/log/aptitude.1.gz" ]]
then
        gunzip -c /var/log/aptitude.*.gz | grep -E "$pattern" | awk '{ print $2; }' > "$outfile"
fi

if [[ -f "/var/log/aptitude" ]]
then
        grep -E "$pattern" "/var/log/aptitude" | awk '{ print $2; }' >> "$outfile"
fi

sort "$outfile"
rm "$outfile"

2
これは、aptitudeを使用してパッケージのみをインストールした場合にのみ機能すると思います。/var/log/apt/history.log(.N.gz)ただし、同様のファイルがあります。
Timmmm

zgrep代わりに使用するgunzipか、にzcatパイプすることができますgrep。これは、gzipに同梱されているラッパースクリプトです。また、非圧縮ファイルを受け入れ、あなたはにスクリプトを簡素化することができzgrep -E '(\[INSTALLIEREN\]|\[INSTALL\])' /var/log/aptitude* | awk '{ print $2 }'
スティーブBuzonas

2

/ var / log / apt /のログファイルを開くと、すべてを取得できます。

次に、apt-getインストールパッケージを手動で除外します。プログラムでこれを行う方法があるかもしれませんが、私はそれを知りません。


1
cd /var/log/apt
cat  history.log | grep Commandline

これにより、過去に実行されたコマンドのリストが表示されます。

さらに情報が必要な場合は、grepコードを削除します。

less history.log

ログが圧縮されている場合(例:gzで終わる)

gunzip <filename>

終了したら、再び圧縮することができます:

gzip <filename>

1
ログファイルを圧縮解除および再圧縮する代わりに、使用しないのはなぜzcatですか?と同じくらい簡単zcat filename.gzです。代わりにgzip圧縮ファイルで使用できますcat。また、grepに置き換えることができますzgrep例えば、zgrep Commandline history.log.1.gz
lgarzo

あなたの考えに基づいて、コマンドラインを作成しました(grep "Commandline" history.log ; zgrep "Commandline" history.log.*.gz ) | grep " install " | grep -v -- "--yes" | sed -r "s/^.*install //"。削除されたパッケージもリストされ、パッケージが複数回インストールされた場合、複数回リストされるため、欠陥があります。
lgarzo

1

ここで解決策が見つからなかったため、dpkgでdebパッケージをインストールしましたが、特に探していたいくつかのアイテムが見つかりませんでした。

かなり長い1つのライナーですが、コピーして貼り付けるのに便利です:

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

上記のコマンドは、パッケージのリストを現在の作業ディレクトリ内のファイルに保存しますmy-packages

説明

最初に、インストール中に選択されたパッケージのベースラインを構成するパッケージのリストを作成しました。

zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > 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 > installed

次に、2つのファイルinitialを比較し、installedインストール済みの固有のアイテムのみをリストしました。

comm -23 installed initial > custom

そこから依存関係を除外したかったのですが、これはこのメソッドが必要なパッケージを見逃す可能性がある場所であり、明示的にインストールされている依存関係を認識していません。

これらのアイテムを処理するこのステップを短縮するために、クイックbash関数を作成しました。

function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; }

その後、ファイルの各行customをでこの関数に渡しましたxargs

echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > deps

考えられるすべての依存関係の長いリストを作成したら(考えられるすべてのステートメントについてはわかりません)、もう一度、単一のファイルに固有の行を取得しました。

comm -23 custom deps > manual

そして、完成したパッケージのリストはmanual、レビュー可能な名前のファイルになりました。


0

誰かがにリンクされているhttps://unix.stackexchange.com/questions/3595/ubuntu-list-explicitly-installed-packages/3624#3624良い解決策を持っていた、しかし、それは適性からの出力として正しく動作しません。変更されました。以下は、12.04 LTSと比較して現在インストールされているパッケージの比較に基づいた更新バージョンです。aptitudeインストールする必要があります。これが唯一の要件です。

aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' > currentlyinstalled && wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f 1 | sort -u > defaultinstalled && comm -23 currentlyinstalled defaultinstalled

上記のコマンドを部分に分解するために、このビットはシステムにインストールされているすべての行ごとに1つのパッケージを出力します

aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' > currentlyinstalled

これにより、デフォルトのパッケージリストがダウンロードされ、冗長な情報がトリミングされます。

wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f 1 | sort -u > defaultinstalled

そしてcomm、2つのファイルを比較し、デフォルトリストにないパッケージを出力します。

comm -23 currentlyinstalled defaultinstalled

他のサイトに移動して、そこで回答を更新することもできます。
マーティンUeding

0

配布マニフェストファイルを基本パッケージセットとして使用します。手動でインストールした結果をアーキテクチャとセクションごとにパッケージグループに並べ替えるので、パッケージのグループに集中しやすくなります(一部のセクションは気にしないかもしれません)。

https://gist.github.com/darrenleeweber/8cc570ff402f19af7fa4

#!/bin/bash

manifest_url='http://releases.ubuntu.com/releases/trusty/ubuntu-14.04.3-desktop-amd64.manifest'
manifest_file=$(echo $manifest_url | sed -e 's#.*/##g')
if [ ! -e $manifest_file ]; then
    wget -q $manifest_url
fi
cat $manifest_file | cut -f1 | sort -u > default_installed.txt

aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currently_installed.txt

comm -23 currently_installed.txt default_installed.txt > manually_installed.txt

# sort the 'mannually_installed.txt' packages by architecture and section
mkdir -p package_files
while read p; do
    apt-cache show $p > info.txt
    arch=$(grep -m1 'Architecture: ' info.txt | sed -e 's/Architecture: //')
    section=$(grep -m1 'Section: ' info.txt | sed -e 's/Section: //' -e 's/\//_/g')
    file="${arch}_${section}_packages.txt"
    echo $p >> "package_files/$file"
done <manually_installed.txt

rm info.txt

パッケージファイルを変更して、各行の先頭にapt-get install -y bashスクリプトを追加するのは簡単です。その後、すべてのパッケージファイルを迷惑なプロビジョニングループに含めることができます。
ダレンウェーバー

0
#! /bin/sh
DEFAULT=`tempfile`
CURRENT=`tempfile`
cat /var/log/installer/initial-status.gz | gzip -d | grep '^Package:' | awk '{ print $2}' | sort -u > $DEFAULT
aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' | awk '{ print $1}' > $CURRENT
comm -23 $CURRENT $DEFAULT
rm $DEFAULT
rm $CURRENT

0

自分に合ったものが見つからなかったので、スクリプトを書きました。/var/log/apt/history.log*および/ var / log / aptitudeの内容を分析し、datetimeでソートすると、2つのリストが作成されます。1つは手動でインストールされたパッケージ、もう1つはインストールされたが削除されたパッケージです。「aptリスト」検証付きのスクリプト。dpkgを使用してPPAソースをインストールおよび変更したため、少しの偏差があります。

ここにhttps://github.com/eexpress/eexp-bin/blob/master/self-installed-pkg.plを置きます

誰かがそれをテストする必要がある場合、おそらくいくつかのコードを変更する必要があります。ログファイルが中国語と英語(特にRFC2822日時形式)で混在しているため、対処する必要があります。 ここに画像の説明を入力してください


読めないテキストのスクリーンショットとは何ですか?
ムル

私のスクリプト出力です。しかし今日、Fedoraのdnfがより効果的であることがわかりました。「dnf history」は、パッケージ操作の純粋な履歴を示します。
utopic eexpress

0

私はあなた/var/log/apt/history.logが行った変更を与えるためにあなたとその友人を使いたいと思う:

zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline: apt(?:-get)? install (?!.*--reinstall)\K.*'

ソースから変更)

のバリエーションを使用して、コマンドラインでインストールされたすべてのパッケージを提供しますapt-get install

古いhistory.logsのzipファイルを取得し、現在のファイルに追加しhistory.logてgrepを通過させ、apt [-get] install [および/または再インストール]で行を抽出し、残りの行(-oフラグ)を表示します。パッケージ名。

sedパッケージ名だけを別々の行にしたい場合は、少し改造する必要があります(たとえば、)。読者のためのエクササイズ!

「ステータス」セクションのシナプスパッケージマネージャー(gksu synapticまたはkdesudo synaptic)に「インストール済み(手動)」リストがあることに注意してください。リスト全体に削除のマークを付けた場合[適用しないでください!!]、マークした変更を保存し、その方法でパッケージのリストを取得できるはずです。注意:これsynapticは私のためにロックアップしました(おそらく依存関係の除去を計算する)。


私の答えからコピーしました。
pbhj
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.