Відповіді:
aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt
wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest \
| cut -f1 | sort -u > defaultinstalled.txt
comm -23 currentlyinstalled.txt defaultinstalled.txt
Один із способів подумати над цією проблемою - це розбити її на три частини:
Наступна команда, здається, працює в моїй системі:
$ aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt
Подібні підходи можна знайти у посиланнях, які Жил розмістив як коментар до питання. Деякі джерела стверджують, що це спрацює лише в тому випадку, якщо ви використовували здатність для встановлення пакетів; однак я майже ніколи не використовую здатність для встановлення пакетів і виявив, що це все-таки працює. У --disable-columns
запобігає APTITUDE від заповнення рядків назв пакунків з пробілами , які будуть перешкоджати порівняння нижче. У | sort -u
сортує файл і видаляє дублікати. Це набагато полегшує заключний крок.
Примітка. Цей розділ починається з "неправильного шляху", який, на мою думку, є ілюстративним. Другий фрагмент коду - той, який працює.
Це трохи складніше. Спочатку я думав, що хорошим наближенням стануть усі пакети, що є залежностями метапакетів ubuntu-minimal, ubuntu-standard, ubuntu-desktop та різних пакетів, пов'язаних з ядром Linux. Кілька результатів пошуку Google, схоже, використовували такий підхід. Щоб отримати список цих залежностей, спершу спробував таке (що не спрацювало):
$ apt-cache depends ubuntu-desktop ubuntu-minimal ubuntu-standard linux-* | awk '/Depends:/ {print $2}' | sort -u
Здається, це залишає деякі пакети, які, як я знаю, повинні були вийти за замовчуванням. Я все ще вважаю, що цей метод повинен працювати, якщо створити правильний список метапакетів.
Однак, схоже, що дзеркала Ubuntu містять файл "маніфесту", який містить усі пакети в установці за замовчуванням. Маніфест для Ubuntu 12.04.3 тут:
http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest
Якщо ви шукаєте цю сторінку (або ближче до дзеркала):
http://mirror.pnl.gov/releases/precision/
Ви повинні мати можливість знайти ".manifest" файл, який відповідає версії та архітектурі, яку ви використовуєте. Для вилучення лише назв пакета я зробив це:
wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f1 | sort -u > defaultinstalled.txt
Список, ймовірно, вже відсортований та унікальний, але я хотів переконатися, що він правильно відсортований, щоб зробити наступний крок простішим. Потім я поставив вихід defaultinstalled.txt
.
Це найпростіша частина, оскільки для більшості Unix-подібних систем є багато інструментів для цього. comm
Інструмент є одним з багатьох способів зробити це:
comm -23 currentlyinstalled.txt defaultinstalled.txt
Це має надрукувати список рядків, унікальних для першого файлу. Таким чином, він повинен надрукувати список встановлених пакетів, які не встановлені за замовчуванням.
http://releases.ubuntu.com/releases/trusty/ubuntu-14.04-desktop-amd64.manifest
і додаткові, | sed "s/ *$//"
але все ще без кісток.
apt-mark showmanual | sort -u
, як показано в інших відповідях. Простіше і не покладається на те, aptitude
що не встановлено за замовчуванням.
Ви можете використовувати будь-який з цих двох одноводкових. Обидва отримують такий же вихід на моїй машині і є більш точними, ніж усі рішення, запропоновані до цього часу (липень 2014 року) у цьому питанні. Вони є комбінацією двох відповідей (1) та (2) . Зверніть увагу , що я спочатку відправив цю відповідь тут .
Використання 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)
Далеко не всі пакети ще падають через тріщину, хоча я підозрюю , що вони є на самому справі встановлено користувачем, або відразу після установки через настройку локалізації мови або , наприклад , з допомогою програми установки Тотема кодека. Крім того, начебто накопичуються версії 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, тоді як інший файл.Обидва перераховують більше пакетів, ніж вказане рішення
Ось декілька вибіркових результатів cat /var/log/apt/history.log
:
Start-Date: 2011-01-22 00:43:38
Commandline: apt-get --target-release experimental install libdbus-1-dev
Upgrade: libdbus-1-3:i386 (1.4.0-1, 1.4.1-1), libdbus-1-dev:i386 (1.4.0-1, 1.4.1-1)
End-Date: 2011-01-22 00:43:48
Start-Date: 2011-01-23 01:16:13
Commandline: apt-get --auto-remove purge webcheck
Purge: python-utidylib:i386 (0.2-6), python-beautifulsoup:i386 (3.1.0.1-2), libtidy-0.99-0:i386 (20091223cvs-1), webcheck:i386 (1.10.3)
End-Date: 2011-01-23 01:16:31
Що стосується вашого питання, відфільтруйте матеріал за допомогою grep ( cat /var/log/apt/history.log | grep Commandline
).
Зауважте, що ці файли обертаються, тому перевірте інші, щоб нічого не пропустити:
$ ls /var/log/apt/history.log*
-rw-r--r-- 1 root root 69120 2011-01-23 18:58 /var/log/apt/history.log
-rw-r--r-- 1 root root 19594 2011-01-01 02:48 /var/log/apt/history.log.1.gz
ПРИМІТКА :
Commandline
, тому grep
фокус з ними не працюватиме.aptitude
іншими керуючими пакетами. Якщо ваші колоди відвернулися, то тоді вам не пощастило.
Під час пошуку цього запиту я натрапив на цей чудовий oneliner
Один лайнер є
comm -13 \
<(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
<(comm -23 \
<(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
<(apt-mark showauto | sort) \
)`
Цей oneliner фільтрує пакети, встановлені системою, використовуючи журнали з /var/log/installer/initial-status.gz
Я опублікую посилання на початковий потік, коли знайшов його, оскільки цей oneliner не мій, і я не можу пригадати, де я його бачив.
Ви хочете подивитися цю статтю .
В кінці статті є сценарій пітона, який повинен робити те, що ви хочете.
Це було написано для (k) ubuntu . але має працювати і для Ubuntu .
Нижче доповнення до відповіді Стівена двійки .
Наступний рядок, як видається, обрізає назви пакетів на 32 символи:
aptitude search '~i !~M' | cut -d" " -f4 | sort -u > currentlyinstalled.txt
Це, здається, працює:
aptitude search '~i !~M' -F "%p" > sort -u > currentlyinstalled.txt
дивіться цю відповідь
Ви також можете подивитися на файл /var/lib/apt/extended_states
.
cat /var/lib/apt/extended_states | grep -B2 'Auto-Installed: 0'
Це корисно, якщо ви хочете знати, що було встановлено на старому розділі.
Великі подяки та вітання тим, хто придумав цей самоцвіт сценарію !!!
Я хотів додати свої 2 ¢, і я позначив дату встановлення, яку я виводжу з $ info.
Я не освоїв деталі, чому $ info файли оновлюються чи ні і коли, але це працює на практиці.
Мій скрипт перелічує останні оновлення пакетів, які не залежать від кількості, доданих після установки.
Періодично перевіряючи, я бачив, що я вручну ввійшов би без жодного промаху.
Тобто партії пакетів, встановлених з тієї ж причини. На жаль, оновлення порушують цей порядок.
Після оновлення системи у мене з’явився список моїх доданих пакунків, які оновлення не оновлювалося, а також тих, що були.
Акуратно! Насолоджуйтесь.
info='/var/lib/dpkg/info/'
comm -13 > /tmp/packages \
<(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
<(comm -23 \
<(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
<(apt-mark showauto | sort) \
)
while read n; do
echo $(ls -ltr --time-style=long-iso $info$n.* $info$n:i386.* $info$n:amd64.* 2>/dev/null \
| tail -n 1 | perl -pe 's/.*([0-9]{4}?-.*:[0-9]{2}?).*/\1/') $n
done < /tmp/packages | sort
aptitude search '~i!~M' -F %p
не так?