이름이 "bigger"인 n개 파일을 제외한 파일을 삭제하시겠습니까?

이름이 "bigger"인 n개 파일을 제외한 파일을 삭제하시겠습니까?

마지막 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

관련 정보