apt
またはによって手動でインストールされたパッケージのリストを取得しaptitude
、foobar
パッケージが手動または自動でインストールされたかどうかを確認できるようにします。コマンドラインからそれを行うきちんとした方法はありますか?
apt
またはによって手動でインストールされたパッケージのリストを取得しaptitude
、foobar
パッケージが手動または自動でインストールされたかどうかを確認できるようにします。コマンドラインからそれを行うきちんとした方法はありますか?
回答:
これら2つのワンライナーのいずれかを使用できます。どちらも私のマシンでまったく同じ出力を生成し、この質問でこれまでに提案されたすべてのソリューション(2014年7月6日)よりも正確です。
を使用してapt-mark
:
comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)
を使用してaptitude
:
comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)
非常に少数のパッケージがまだクラックを通過しますが、これらはユーザーが言語ローカリゼーションセットアップまたはTotemコーデックインストーラーなどを使用してインストールした直後に実際にインストールされていると思われます。また、バージョン固有でないメタパッケージのみをインストールしたにもかかわらず、linux-headerバージョンも蓄積されているようです。例:
libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29
仕組み:
sed
は行の終わりに残っている空白を取り除きます。他の可能性もうまくいきません:
ubuntu-14.04-desktop-amd64.manifest
ファイル(ここではUbuntu 14.04用)を使用します/var/log/installer/initial-status.gz
。より多くのパッケージは、手動でインストールされていないと表示されます。apt-mark showauto
代わりに使用します/var/log/installer/initial-status.gz
。apt-mark
たとえば、xserver-xorgパッケージは含まれませんが、他のファイルは含まれます。参照として他のさまざまなStackExchange投稿を使用しましたが、上記のソリューションほどうまく機能しません。
どちらも上記のソリューションよりも多くのパッケージをリストします。
編集:以前のリリースからアップグレードした場合の対処方法:
Ubuntuをあるリリースから次のリリースにアップグレードした場合、おそらくこのプロセスを調整する必要があります。その場合、現在のリリースのinitial-status.gzファイルに加えて、新しいリリースのマニフェストファイル(上記参照)を確認します。別の比較を追加するだけで簡単に実行できます。マニフェストファイルにはinitial_status.gzファイルに含まれるすべてが含まれていないため、マニフェストファイルのみを使用しても機能しません(チェックしました)。
/var/log/installer/initial-status.gz
不足しているため、これは私のために動作しませんでした。また、これがaptsのマーキングに依存しているかどうかを知りたいmanual
ですか?
showmanual
以下のコマンドを実行しました。そしてcomm
、2つの(ソートされた)リストを比較するために使用します。そのshowmanual
結果、このメソッドでは表示されない1,840個以上のユニークなパッケージが得apt-mark showmanual
られました。パッケージは、このcomm
-command の出力に固有のものではありません。私のPCの場合、894個のパッケージが両方の結果にリストされていることを記録する方が興味深いと思います。なぜそんなに大きな矛盾があるのかはわかりません。いくつかの(多くの?)パッケージはリリース固有のようです。XOrg、GTKコンポーネントなどのようなlib*
ものは更新される可能性があります。 とにかく、この答えは非常に良いスタートです。
apt-mark showmanual
。どれだけ多くの違いが見えるかは興味深いです。リストには238個のパッケージがあり、showmanualは1717個のパッケージを返します。2179個のインストール済みパッケージのうち、両方のリストには223個のみ、15個はあなたのもの(例:nodejs、lightdm)、223個はshowmanual(例:xserver-xorg、ubuntu-desktop)のみです。あなたのリストはもっと役立つように感じますが、これらの違いがどこから来たのか分からないので、決めるのは簡単ではありません...(しかし、nginxとlightdmを手動でインストールしたと確信しています...)[ごめんなさい同じ;)]
パッケージaptの新しいバージョンには、apt-markコマンドもあります
apt-mark showmanual
linux-image-3.11.0-*-generic
他をマニュアルとみなす理由はありません
linux-image-3.13.0-24-generic
手動ですが、電流linux-image-3.13.0-27-generic
は自動です。(この場合、参照元のパッケージのアップグレードと思われるlinux-image-generic
依存関係を変更し、)、取扱説明書のマークが自動的に設定されている
apt-get autoremove
。これは間違いなくあなたが望むものではありません。
Ubuntu 16.04の場合は、ログファイルを確認してください/var/log/apt/history.log
。
例えば:
zgrep 'Commandline: apt' /var/log/apt/history.log /var/log/apt/history.log.*.gz
完璧ではありませんが、手作業でインストールしたものを正確に明確にするのにはかなり優れています。-B 1
grepにaを付けて、いつインストールされたかを確認します。
出力例
Commandline: apt install postgresql-9.5-plv8
Commandline: aptdaemon role='role-install-file' sender=':1.85'
Commandline: apt install task
Commandline: apt autoremove
Commandline: apt install atom
Commandline: apt upgrade
Commandline: apt-get install asciinema
Commandline: apt install iperf3
Commandline: apt upgrade
Commandline: apt-get install chromium-browser
Commandline: apt install joe cpanminus build-essential postgresql libdbd-pg-perl libcrypt-openssl-bignum-perl libcrypt-openssl-rsa-perl libio-socket-ssl-perl libnet-ssleay-perl libssl-dev
Commandline: aptdaemon role='role-commit-packages' sender=':1.2314'
Commandline: apt install git
Commandline: apt install sqlite
Commandline: apt install whois
Commandline: apt install libdbd-pg-perl
Commandline: apt install perl-doc
Commandline: apt upgrade
これがaptitude
うまくいくかどうかはわかりません。Ubuntu Softwareのデスクトップアプリからインストールをピックアップしていないようです。
apt-mark showauto | grep -iE '^foobar$'
パッケージが自動的にインストールされた場合は「foobar」を出力し、それ以外は何も出力しません。
aptitude search '!~M ~i'
自動的にインストールされなかったパッケージをリストします。残念なことに、10.10以降、Ubuntuデスクトップのデフォルトのインストールには含まれません。
aptitude search
手動でインストールされたパッケージだけでなく、すべてのパッケージを表示します(OPが望んでいたものだと思います)
aptitude search '!~M ~i'
、それは1043パッケージをリストします。多くのパッケージを手動でインストールする方法はありません。
次のスクリプトは、自動インストールに設定されていないため手動でインストールされたすべてのパッケージを出力します。
#!/usr/bin/python
try:
import apt_pkg
except ImportError:
print "Error importing apt_pkg, is python-apt installed?"
sys.exit(1)
apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
pkgname = tagfile.section.get("Package")
autoInst = tagfile.section.get("Auto-Installed")
if not int(autoInst):
auto.add(pkgname)
print "\n".join(sorted(auto))
これは、apt-markが自動的にインストールされたパッケージをどのように印刷するかに基づいています。
sys.exit(1)
without を使用するとimport sys
、新しいバージョンのpythonでエラーが発生する場合があります。どちらかimport sys
または使用exit(1)
。
すべてのパッケージ(インストールされていない、ユーザーによってインストールされていない、またはデフォルトでインストールされている、すべてのPPAを除く)のリストを取得するにapt
は、次の方法を使用します。
apt list [option]
これに役立つ可能なオプションは次のとおりです。
--installed
システムにインストールされているパッケージのみを表示する(約50,000以上)
--manual-installed
コマンドによって明示的にインストールされたパッケージを、直接または依存関係としてリストします。
または、次のこともできます。
apt list --manual-installed | grep -F \[installed\]
ユーザーコマンドとそれらの依存関係のみに起因するパッケージのリストを取得し、サポートされているバージョンやアーキテクチャー(x86、x86_64、amd64、allなど)などの追加情報を取得します。
数人がコメントしているように、apt-mark showmanualは少しバグが多いようです(バグ727799として報告しました)。私がそれを使用しているとき、実際には/ var / lib / apt / extended_states(これが保存されることになっている)に記録されていないものも多く報告し、apt-getはインストールされたものを記録しません/ var / lib / apt / extended_states(/ var / lib / dpkg / statusのみ)。上記のtxwikingerによるpythonスクリプトは、/ var / lib / apt / extended_statesから直接描画しますが、今日使用している場合、構文が機能しない可能性があります(Kubuntu 13.10でエラーを生成し始めたばかりです)。更新された構文は次のとおりです。
#!/usr/bin/python
import sys
try:
import apt_pkg
except ImportError:
print "Error importing apt_pkg, is python-apt installed?"
sys.exit(1)
apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
pkgname = tagfile.section.get("Package")
autoInst = tagfile.section.get("Auto-Installed")
if not int(autoInst):
auto.add(pkgname)
print "\n".join(sorted(auto))
私にとって、これは5つのアイテムの非常に短いリストであり、正確ではないようです。
sys.exit(1)
without を使用するとimport sys
、新しいバージョンのpythonでエラーが発生する場合があります。どちらかimport sys
または使用exit(1)
。
GUIソリューションを提供したいと思います。
開いた Synaptic Package Manager
に行く Status
クリック Installed (manual)
aptまたはaptitudeによって手動でインストールされたパッケージのリストが表示されます。
残念ながらCustom Filters
、foobar
パッケージが手動でインストールされたのか自動でインストールされたのかを知るオプションが見つかりませんでした。
パッケージが下にあるInstalled
が下にない場合は、Installed (manual)
自動的にインストールされました。パッケージが下にある場合、Installed (manual)
手動でインストールされました。
apr-somethingコマンドを使用して誰もあなたに良い答えを与えない場合、あなたはそれを難しい方法で行うことができます。Apt-getはその情報を/ var / lib / apt / extended_statesに保存します。自動的にインストールされるファイルは、このファイルに追加されます。このファイルに既に手動でパッケージをインストールする場合、パッケージはこのファイルに残りますが、2行目に0が自動インストールされます。削除されません。
注:予想どおり、ファイル配置の変更が現れた場合に機能する可能性が高いより良い回答。ファイルの場所に関する情報が役に立つ場合に備えて、私は私のものを保管しています。
apt-get install liferea
それをインストールしませんでしたが、「手動でインストール済みとしてマークされた」という結果になるような出力が得られました。現在、lifereaはファイル内にありますが、次の行の0
代わりにがあり1
ます。また、正規表現パターンをの" foobar$"
代わりにに変更する必要がありますfoobar
。
たくさんググリングした後、私はこのスクリプトを組み立てることができました。それは私にとってはうまくいきます:
# List of all packages currently installed
current=$(dpkg -l | awk '{print $2}' | sort | uniq)
# List of all packages that were installed with the system
pre=$(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort | uniq)
# List of packages that don't depend on any other package
manual=$(apt-mark showmanual | sort | uniq)
# (Current - Pre) ∩ (Manual)
packages=$(comm -12 <(comm -23 <(echo "$current") <(echo "$pre")) <(echo "$manual") )
for pack in $packages; do
packname=$(echo $pack | cut -f 1 -d ":")
desc=$(apt-cache search "^$packname$" | sed -E 's/.* - (.*)/\1/')
date=$(date -r /var/lib/dpkg/info/$pack.list)
echo "# $desc"
echo "# $date"
echo "sudo apt-get install $pack"
echo -e ""
done
sort -u
代わりに使用できますsort | unique
。以下のようapt-mark
なアーキテクチャを表示しない、あなたは、集合演算(または使用前にはdpkgの出力からそれを取り除く必要がありますdpkg-query -W -f='${Package}\n'
)。また、dpkgは現在インストールされていないパッケージをリストする場合があります。「desc」については、 `dpkg-query -W -f = '#$ {binary:Summary} \ n' $ packを使用できますが、これは高速です。
apt-mark
いくつかのパッケージのアーキテクチャを表示するかもしれませんが、多くのパッケージは表示しませんdpkg -l
。
apt-cache search
遅い。help.ubuntu.com/community/ListInstalledPackagesByDateのようなものを使用して事前にインストールされた日付のリストを取得する方がより効率的かもしれません
Li Loが言ったように、apt-mark showauto
自動的にインストールされるものの詳細なリストを取得する必要があります。
手動でインストールされたものを表示するために、aptitudeに素敵なシンプルな検索修飾子があることがわかりました。しかし、あなたはそれをしたくありません。ロケット科学を行う巨大なbashコマンドを書きたいと思います。
注:これは、大規模なbashコマンドをすべての友達に破壊することの見栄えを示す例です。
comm -3 <(dpkg-query --show -f '${Package} ${Status}\n' | \n
grep "install ok installed" | cut --delimiter=' ' -f 1) <(apt-mark showauto)
読みやすくするために、2行に分割しました。これは何をしますか?
apt-mark
comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort)
適切に良いです;)
これにより、依存関係、アンインストールされたパッケージ、システムのインストール中にインストールされたパッケージのない、手動でインストールされたすべてのパッケージがリストされます。
unopts() {
in=`cat`
echo "$in" | sed -r 's/ --[^ ]+//g;s/ -[^ ]+//g'
}
list() {
cat '/var/log/apt/history.log' |
grep --color=never -v '\-o APT::Status-Fd=4 \-o APT::Keep-Fds::=5 \-o APT::Keep-Fds::=6' |
egrep --color=never "Commandline: apt-get.* $1" |
sed -r "s/Commandline: apt-get//;s/ $1//" |
unopts |
tr ' ' '\n' |
sed '/^$/d'
}
hapt() {
tmp=`mktemp -d`
installed=$tmp/installed
deleted=$tmp/deleted
dpkg=$tmp/dpkg
list 'install' > $installed
list '(remove|purge|autoremove)' > $deleted
dpkg --get-selections |
grep -v 'deinstall' |
cut -f 1 > $dpkg
while read package
do
sed -i "0,/$package/{//d;}" $installed
done < $deleted
while read package
do
if [ -z "`grep --color=never "^$package$" $dpkg`" ]
then
sed -i "0,/$package/{//d;}" $installed
fi
done < $installed
cat $installed
rm -r $tmp
}