apt-get autoclean
удаляет устаревшие .deb
файлы из /var/cache/apt/archives
каталога, которые больше не доступны или не могут быть загружены.
в то время как apt-get clean
удаляет каждый .deb
файл, расположенный в /var/cache/apt/archives
каталоге.
Я хочу удалить .deb
файлы только тех пакетов, которые больше не установлены, были деинсталлированы или удалены. Как это сделать?
решение1
APT использует fcntl(2)
блокировку; поскольку Ubuntu не предоставляет команду блокировки fcntl, вы можете использоватьfcntl-блокировкаутилита для блокировки (клон команды flock Питера Энвина, правда, немного устаревший).
#!/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
Если вы хотите автоматизировать, я думаю, что с помощьюsystemd.путьработает лучше всего.
apt-archive-clean.путь
[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