다음과 같은 이름으로 매주 생성되는 여러 파일이 포함된 디렉터리가 있습니다.
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