Entfernen Sie nicht benötigte Abhängigkeiten von Cygwin

15

Wenn ich in Cygwin ein neues Paket installiere, werden automatisch alle für dieses Paket erforderlichen Abhängigkeiten installiert.

Wie kann ich später, wenn ich dieses Paket entfernen möchte, die damit installierten Abhängigkeiten entfernen, die nicht mehr benötigt werden?

Josh
quelle

Antworten:

8

Nun, hier ist meine aktuelle Lösung, die ich mir ausgedacht habe. Nutzung meiner (sehr) eingeschränkten Kenntnisse in Bash und Google.

#!/bin/bash
# Print a list of packages that no other package depends on

PackageCount=0
PackageIter=0

# Populate package array
declare -A Packages
PackageList=$(cygcheck.exe -c | cut -d' ' -f1 | tail -n +3)
for P in $PackageList; do
    Packages[${P,,}]=0
    ((PackageCount++))
done

# Determine the last mirror used
LastMirror=$(sed -n '/last-mirror/{n;p}' /etc/setup/setup.rc | tr -d '\t')
echo "[DEBUG] LastMirror = $LastMirror"

# Download the setup.ini file from the mirror server
echo "[DEBUG] Downloading setup.ini from mirror"
if which bzcat &>/dev/null; then
    wget --quiet "${LastMirror}$(uname -m)/setup.bz2" -O - | bzcat > setup.ini
else
    wget --quiet "${LastMirror}$(uname -m)/setup.ini" -O setup.ini
fi

for P in $PackageList; do
    ((PackageIter++))
    echo -ne "[DEBUG] Processing packages $((PackageIter * 100 / PackageCount))%\r"

    deps=$(sed -n "/^@ $P$/,/^requires/p" setup.ini | grep -i '^requires' | cut -d' ' -f2-)

    for dep in $deps; do
        if [[ ${Packages[${dep,,}]} ]]; then
            Packages[${dep,,}]=$((Packages[${dep,,}]+1))
        fi
    done
done

echo -e "\n== Packages =="

for P in $PackageList; do
    if [[ ${Packages[${P,,}]} == 0 ]]; then
        echo $P
    fi
done

rm setup.ini

Ich würde gerne sehen, ob jemand eine bessere Lösung oder Tipps zur Verbesserung meines Skripts hat.

Josh
quelle
Ich weiß nicht, ob Sie noch auf der Website sind, aber ich habe Ihr Skript bearbeitet, um einen N=$N+1Fehler zu beheben. In Bash wird hierdurch tatsächlich eine Zeichenfolge erstellt und keine mathematische. Wenn Sie die Anweisung in (( ))einschließen, können Sie echte Mathematik in Bash ausführen (wie Sie später im Skript festgestellt haben müssen). Außerdem habe ich diesen Teil nicht geändert, aber Sie müssen die Anzahl der Elemente in einem Array nicht zählen. Stattdessen $PackageCountkönnen Sie ${#PackageList}direkt auf zugreifen , um die Anzahl der Elemente abzurufen.
Piojo