매달 최신 백업 파일을 제외하고 모두 삭제

매달 최신 백업 파일을 제외하고 모두 삭제

다음과 같은 이름으로 매주 생성되는 여러 파일이 포함된 디렉터리가 있습니다.

 db_20130101_foo.tgz
 db_20130108_foo.tgz
 db_20130115_foo.tgz
 ...

등. 수년이 지나면 디스크가 꽤 가득 차게 됩니다. 파일에는 몇 주 분량의 데이터가 포함되어 있으므로 이전 파일을 삭제할 수 있습니다. 모든 파일을 삭제하고 싶지만 항상 매월 마지막 파일을 유지합니다. 작업량이 많고 오류가 발생하기 쉬운 rm에 파일 이름을 수동으로 복사하여 붙여넣지 않고도 이 작업을 수행할 수 있는 방법은 무엇입니까?

답변1

이 oneliner는 삭제할 파일을 제공합니다.

(ls -1 db_*_foo.tgz; echo) awk '{prevym=ym;previous file=file; ym=substr($0,4,6);file=$0; if (ym==prevym) 파일}'

첫 번째 부분은 단순히 모든 파일을 나열합니다(그리고 후속 awk 명령을 단순화하기 위해 목록 끝에 추가 행을 추가합니다). 이 awk부분에서는 각 행을 확인하여 ym(년 월)이 한 행에서 다음 행으로 변경되는지 확인합니다.

실제로 삭제하려는 파일이 위에 나열되어 있는지 테스트하고 확인하십시오. 그런 다음 모든 파일을 삭제하려면 다음 명령을 입력하십시오.

...ABOVE_COMMAND... xargs rm

답변2

정답은 바로 Ruby입니다. group_by동일한 "키"(파일 이름의 처음 9자)를 사용하여 파일을 가져올 수 있는 좋은 방법이 있습니다 .

files = Dir.glob("*")
to_delete = []
files.group_by {|f| f[0,9]}.each_pair {|k,v| to_delete.push *(v.sort[0..-2])}
puts "removing: #{to_delete}"
File.delete to_delete

관련 정보