마지막 n개 파일을 제외한 이전 버전의 파일을 삭제하는 쉘 스크립트를 만들고 싶습니다. 즉, 새 버전을 배포하면 마지막 n개 버전만 유지됩니다.
파일 이름의 형식은 다음과 같습니다.
appname_releasenumber_date.tar.gz
어쩌면 이를 위한 간단한 해결책이 있을 수도 있지만 어떻게 해야 할지 모르겠습니다.
이 해결책을 찾았습니다Linux에서 파일 이름의 일부로 날짜 스탬프가 포함된 파일을 삭제하는 더 깔끔한 방법하지만 원하는 파일 수를 유지하려면 먼저 일부 파일을 생성해야 합니다.
답변1
더 일반적으로 만들기 위해 @Salton의 답변을 변경하겠습니다.
ls -1 | sort -t_ -n -k2 | head -$((`ls | wc -l`-1)) | xargs rm -rf
이것은 버전 번호별로 정렬하고 날짜를 완전히 무시합니다. 따라서 이전 버전의 날짜가 최신인 경우 이전 버전이 삭제됩니다.
답변2
zsh에서 버전이 사전순으로 되어 있는 경우:
rm -f appname_*.tar.gz(N[1,-$((n+1))])
이것글로벌 예선 [NUM1,NUM2]
NUM1에서 NUM2까지 일치하는 항목만 유지됩니다. 빼기 기호를 사용하면 숫자가 끝부터 계산되므로(-1이 마지막 일치) [1,-$((n+1))]
마지막 $n
파일을 제외한 모든 파일이 일치됩니다. glob 한정자는 N
일치하는 항목이 없어도 문제가 되지 않음을 의미합니다( $n
이미 존재하는 파일이 많지 않은 경우 발생할 수 있음).
버전이 사전순으로 되어 있지 않으면 파일을 다른 순서로 정렬해야 할 수도 있습니다. glob 한정자는 n
십진수를 값별로 정렬하므로 appname_9_somedate
뒤에 appname_10_someotherdate
.
rm -f appname_*.tar.gz(nN[1,-$((n+1))])
버전 번호가 더 복잡하다면 고유한 정렬 기능을 지정할 수 있습니다. version_less
첫 번째 인수가 두 번째 인수보다 작으면 0을 반환하는 zsh 함수를 작성하고 다음을 사용하세요.
rm -f appname_*.tar.gz(N[1,-$((n+1))]o+version_less)
모든 셸에서 파일이 사전순으로 되어 있으면 일치 항목을 반복할 수 있습니다.
set appname_*.tar.gz
while [ $# -gt $n ]; do
rm "$1"
shift
done
다른 순서가 필요한 경우 구문 분석된 출력이 ls
최선의 선택입니다. 이렇게 하면 ls
파일 이름에서 인쇄할 수 없는 문자가 깨질 수 있지만 귀하의 경우에는 문제가 되지 않습니다.
답변3
가장 오래된 파일을 검색한 다음 총 파일 수가 N개 파일보다 큰지 확인한 다음 스크립트에서 가장 오래된 파일을 먼저 삭제하거나 다음 예제를 간단히 사용할 수 있습니다. 마지막 3개의 최신 파일을 삭제하고 싶지 않다고 가정해 보겠습니다.
ls -t1 | tail -n +4 | xargs rm -rf