Jak mogę sprawdzić, ile miejsca zajmują określone pakiety?

1

Utrzymuję listę pakietów zainstalowanych w moim systemie (za pomocą apt-get). Chciałbym wiedzieć, ile miejsca zajmują te pakiety wraz z ich zależnościami, jeśli to możliwe.

Czy mogę użyć do tego jakiegoś narzędzia, czy też muszę napisać własny skrypt, który podsumowałby wszystkie odpowiednie pliki (pliki binarne, biblioteki dynamiczne itp.)?

syntagma
źródło
Musisz to wiedzieć przed instalacją? Ten skrypt dziennika może później powiedzieć: askubuntu.com/a/601772/72216
Jacob Vlijm
Potem, ale jeśli dobrze rozumiem, skrypt, który łączysz, pokaże mi tylko przestrzeń po i przed instalacją określonego oprogramowania. Mam już zainstalowane wszystkie te pakiety.
syntagma
Ach, rozumiem, to szkoda. W wielu przypadkach trudno będzie powiedzieć, co jest, ponieważ wiele bibliotek będzie udostępnianych. Możliwe byłoby wykonanie skryptu, aby zobaczyć rozmiar pakietu i jego zależności, ale to niekoniecznie musi być równe rzeczywistej zmianie miejsca na dysku podczas jego instalacji.
Jacob Vlijm

Odpowiedzi:

3

Możesz wypróbować ten bashskrypt:

#!/bin/bash
all_files=( $(dpkg -L "$1") )
for file in "${all_files[@]}"; do
        [ -f "$file" ] && du -h "$file"
done

Przekaż nazwę pakietu jako pierwszy argument, np bash script.sh nano.

dpkg -L packagewyświetli listę wszystkich zainstalowanych plików package, zapisaliśmy listę jako tablicę. Będzie on zawierał także katalogi nadrzędne, aby pozbyć się katalogów, które przeprowadziliśmy test [ -f "$file" ], więc jeśli element tablicy jest zwykłym plikiem, wówczas uzyskamy rozmiar pliku na dysku według du -h.

Oto wynik testu:

$ bash check_disk.sh vlc
4.0K    /usr/share/menu/vlc
4.0K    /usr/share/lintian/overrides/vlc
8.0K    /usr/share/applications/vlc.desktop
4.0K    /usr/share/kde4/apps/solid/actions/vlc-openbd.desktop
4.0K    /usr/share/kde4/apps/solid/actions/vlc-opencda.desktop
4.0K    /usr/share/kde4/apps/solid/actions/vlc-opendvd.desktop
4.0K    /usr/share/kde4/apps/solid/actions/vlc-openvcd.desktop
4.0K    /usr/lib/mime/packages/vlc
32K /usr/lib/vlc/plugins/video_output/libxcb_xv_plugin.so
12K /usr/lib/vlc/plugins/video_output/libaa_plugin.so
28K /usr/lib/vlc/plugins/video_output/libxcb_window_plugin.so
32K /usr/lib/vlc/plugins/video_output/libgl_plugin.so
24K /usr/lib/vlc/plugins/video_output/libxcb_x11_plugin.so
12K /usr/lib/vlc/plugins/video_output/libglx_plugin.so
40K /usr/lib/vlc/plugins/video_output/libxcb_glx_plugin.so
16K /usr/lib/vlc/plugins/video_output/libcaca_plugin.so
32K /usr/lib/vlc/plugins/video_filter/libpanoramix_plugin.so
16K /usr/lib/vlc/plugins/services_discovery/libxcb_apps_plugin.so
776K    /usr/lib/vlc/plugins/gui/libskins2_plugin.so
2.5M    /usr/lib/vlc/plugins/gui/libqt4_plugin.so
16K /usr/lib/vlc/plugins/control/libglobalhotkeys_plugin.so
20K /usr/lib/vlc/plugins/access/libxcb_screen_plugin.so
12K /usr/lib/vlc/plugins/misc/libxdg_screensaver_plugin.so
12K /usr/lib/vlc/plugins/codec/libsdl_image_plugin.so
32K /usr/lib/vlc/plugins/codec/libvaapi_plugin.so
4.0K    /usr/bin/qvlc
4.0K    /usr/bin/svlc
0   /usr/share/man/man1/qvlc.1.gz
0   /usr/share/man/man1/svlc.1.gz
heemayl
źródło
Bardzo fajnie +1. Tyle tylko, że nie wymienia zależności. Jednocześnie zależność między listami jest prawie niemożliwa, ponieważ wiele z nich zostanie udostępnionych innym aplikacjom.
Jacob Vlijm
@JacobVlijm: Dzięki .. myślałem też o zależnościach, byłby to rodzaj nieskończonego łańcucha, a także, jak wspomniałeś, nie byłby dobry :)
heemayl
3

Nie mogłem się oprzeć rozszerzeniu, całkowicie opartemu na koncepcji heemayla, aby stworzyć skrypt z dwiema opcjami:

  1. Wyprowadzaj tylko (całkowity) rozmiar zainstalowanego pakietu (ale bez jego zależności, ponieważ zależności są praktycznie zawsze współużytkowane, więc który pakiet powinien mieć go na swoim „koncie”?)

    przykład:


    $ check_size gimp
    6644.1K

lub:

  1. Utwórz bardziej szczegółowy raport na temat katalogów, plików, ich rozmiarów i całkowitego rozmiaru zainstalowanych plików (oczywiście większość wierszy jest pomijana):

    $ check_size gimp --verbose

    Directories:
    ====================
    /usr/share/man
    /usr/share/man/man1
    /usr/share/menu
    /usr/share/pixmaps
    /usr/share/python
    /usr/share/python/runtime.d

    Installed files:
    ====================
    48K /usr/lib/gimp/2.0/plug-ins/sample-colorize
    5,5M    /usr/bin/gimp-2.8
    52K /usr/lib/gimp/2.0/plug-ins/curve-bend
    52K /usr/lib/gimp/2.0/plug-ins/file-psd-load
    52K /usr/lib/gimp/2.0/plug-ins/filter-pack
    52K /usr/lib/gimp/2.0/plug-ins/pagecurl
    52K /usr/lib/gimp/2.0/plug-ins/video
    56K /usr/lib/gimp/2.0/plug-ins/color-rotate
    56K /usr/lib/gimp/2.0/plug-ins/file-ps
    56K /usr/lib/gimp/2.0/plug-ins/print
    56K /usr/lib/gimp/2.0/plug-ins/selection-to-path

    Total size:
    ====================
    6644.1K

Jak używać

  1. Skopiuj poniższy skrypt do pustego pliku, zapisać go jako check_sizew ~/bin(lub gdzie indziej w $ PATH), bez rozszerzenia języka.
  2. Spraw, by skrypt był wykonywalny
  3. Jeśli właśnie utworzyłeś katalog ~/bin, uruchom source .profilelub wyloguj się / zaloguj.
  4. Uruchom go za pomocą polecenia:

    check_size <package>
    

    tylko dla rozmiaru lub:

    check_size <package> --verbose
    

    dla pełnych informacji

Scenariusz

#!/usr/bin/env python3
import subprocess
import os
import sys

files = []; drs = []; sizes = []
get =  subprocess.check_output(["/bin/bash", "-c", "dpkg -L "+sys.argv[1]]).decode("utf-8").splitlines()
for l in get:
    if os.path.isfile(l):
        info = subprocess.check_output(["du", "-h", l]).decode("utf-8")
        sizes.append(float(info.split()[0].replace("K", "").replace(",", ".").replace("M", "")))
        files.append(info)
    else:
        drs.append(l)
try:
    if sys.argv[2] == "--verbose":
        print("\nDirectories:\n"+20*"=")
        for l in sorted(drs):
            print(l)
        print("\nInstalled files:\n"+20*"=")
        for l in sorted(files):
            print(l.strip())
        print("\nTotal size:\n"+20*"=")
        print(str(sum(sizes))+"K")
except IndexError:
    print(str(sum(sizes))+"K")
Jacob Vlijm
źródło