apt-cache에서 제거된 패키지의 .deb 파일 삭제

apt-cache에서 제거된 패키지의 .deb 파일 삭제

apt-get autoclean더 이상 사용할 수 없거나 더 이상 다운로드할 수 없는 오래된 .deb파일을 디렉토리에서 삭제합니다./var/cache/apt/archives

반면 디렉토리 에 있는 apt-get clean모든 파일을 삭제합니다 ..deb/var/cache/apt/archives

.deb더 이상 설치되지 않거나 제거되거나 제거된 패키지의 파일만 삭제하고 싶습니다 . 어떻게 해야 하나요?

답변1

fcntl(2)APT는 잠금 에 의존합니다 . 우분투는 fcntl lock 명령을 제공하지 않으므로 다음을 사용할 수 있습니다.fcntl-잠금잠금용 유틸리티(Peter Anvin의 무리 명령의 복제품이지만 약간 구식임).

#!/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

자동화하고 싶다면 다음을 사용하는 것 같습니다.시스템 경로가장 잘 작동합니다.

적절한 아카이브-clean.path

[Unit]
Description=APT Archive Cleanup

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

[Install]
WantedBy=multi-user.target

적절한 아카이브-clean.service

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

관련 정보