apt-get autoclean
löscht veraltete .deb
Dateien aus /var/cache/apt/archives
dem Verzeichnis, die nicht mehr verfügbar sind oder nicht mehr heruntergeladen werden können.
wobei apt-get clean
jede einzelne .deb
Datei im /var/cache/apt/archives
Verzeichnis gelöscht wird.
Ich möchte .deb
nur 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