Löschen Sie .deb-Dateien entfernter Pakete aus dem Apt-Cache

Löschen Sie .deb-Dateien entfernter Pakete aus dem Apt-Cache

apt-get autocleanlöscht veraltete .debDateien aus /var/cache/apt/archivesdem Verzeichnis, die nicht mehr verfügbar sind oder nicht mehr heruntergeladen werden können.

wobei apt-get cleanjede einzelne .debDatei im /var/cache/apt/archivesVerzeichnis gelöscht wird.

Ich möchte .debnur die Dateien der Pakete löschen, die nicht mehr installiert sind, deinstalliert oder entfernt wurden. Wie geht das?

Antwort1

APT basiert auf fcntl(2)Sperren. Da Ubuntu keinen fcntl lock-Befehl bereitstellt, können Siefcntl-SperreDienstprogramm zum Sperren (ein Klon von Peter Anvins Flock-Befehl, allerdings etwas veraltet).

#!/bin/bash

apt_cache=/var/cache/apt/archives

# Link: https://github.com/magnumripper/fcntl-lock
# fcntl-lock is a fcntl() clone of H. Peter Anvin's flock(1)
coproc LOCK {
    exec fcntl-lock \
    -x -w 3600 "$apt_cache/lock" -c 'echo true; exec cat'
}
read -ru ${LOCK[0]} || { \
    echo Failed to obtain a lock.
    exit 1
}

declare -a a=()
declare -A A=() B=()

# URL decode .deb filenames.
cd "$apt_cache"
for b in *.deb; do
    printf -v c %b "${b//%/\\x}"; A[$c]=$b
done

# You may use @(rc|ii) to add more Abbrev's
while read -r d e; do
    [[ $d = ii ]] && B[$e]=1
done < <( \
    dpkg-query \
        -Wf='${db:Status-Abbrev} ${Package}_${Version}_${Architecture}.deb\n' \
)

for f in "${!A[@]}"; do
    [[ ${B[$f]} = 1 ]] || \
        a+=("$apt_cache/${A[$f]}")
done
((${#a[@]} > 0)) && \
    printf %s\\0 "${a[@]}" | xargs -0 rm -v || exit 0

# echo Success | ts >> /var/log/apt-archive-clean.log

Wenn Sie automatisieren möchten, denke ich, mitsystemd.Pfadfunktioniert am besten.

apt-archive-clean.path

[Unit]
Description=APT Archive Cleanup

[Path]
PathChanged=/var/cache/apt/archives/lock

[Install]
WantedBy=multi-user.target

apt-archive-clean.service

[Unit]  
Description=APT Archive cleanup  
  
[Service]  
Type=simple  
ExecStart=/opt/bin/apt-archive-clean.sh

verwandte Informationen