매월 마지막 파일을 제외한 모든 파일 삭제

매월 마지막 파일을 제외한 모든 파일 삭제

파일 이름의 일부로 타임스탬프가 포함된 MySQL 백업 파일이 포함된 디렉터리를 생각해 보세요.

-rw-rw-r-- 1 ubuntu ubuntu 35856184 Nov 16 16:00 db_2013-11-16_1600.sql
-rw-rw-r-- 1 ubuntu ubuntu 35856915 Nov 16 17:00 db_2013-11-16_1700.sql
-rw-rw-r-- 1 ubuntu ubuntu 35857565 Nov 16 18:00 db_2013-11-16_1800.sql
-rw-rw-r-- 1 ubuntu ubuntu 35858254 Nov 16 19:00 db_2013-11-16_1900.sql
-rw-rw-r-- 1 ubuntu ubuntu 35860276 Nov 16 20:00 db_2013-11-16_2000.sql
-rw-rw-r-- 1 ubuntu ubuntu 35861583 Nov 16 21:00 db_2013-11-16_2100.sql
-rw-rw-r-- 1 ubuntu ubuntu 35863630 Nov 16 22:00 db_2013-11-16_2200.sql
-rw-rw-r-- 1 ubuntu ubuntu 35864868 Nov 16 23:00 db_2013-11-16_2300.sql
-rw-rw-r-- 1 ubuntu ubuntu 35866095 Nov 17 00:00 db_2013-11-17_0000.sql
-rw-rw-r-- 1 ubuntu ubuntu 35887731 Nov 17 01:00 db_2013-11-17_0100.sql
-rw-rw-r-- 1 ubuntu ubuntu 35888871 Nov 17 02:00 db_2013-11-17_0200.sql
-rw-rw-r-- 1 ubuntu ubuntu 35888871 Nov 17 03:00 db_2013-11-17_0300.sql
-rw-rw-r-- 1 ubuntu ubuntu 35889319 Nov 17 04:00 db_2013-11-17_0400.sql

실제로 2012년 9월에 시작되었습니다! 매월 마지막 백업을 제외한 모든 백업을 삭제해야 합니다. 즉, 다음 파일을 보존해야 합니다.

db_2012-09-30_2300.sql
db_2012-10-31_2300.sql
db_2012-11-30_2300.sql
db_2012-12-31_2300.sql
db_2013-01-31_2300.sql
db_2013-02-28_2300.sql
db_2013-03-31_2300.sql
db_2013-04-30_2300.sql
db_2013-05-30_2300.sql
db_2013-06-30_2300.sql
db_2013-07-31_2300.sql
db_2013-08-31_2300.sql
db_2013-09-30_2300.sql
db_2013-10-31_2300.sql
db_2013-11-20_0700.sql # Because this month has not finished yet!

Bash/Python 스크립트를 작성하여 매월 목록을 만들고 목록에서 마지막 항목을 제거한 다음 나머지 파일을 하나씩 삭제할 수 있습니다. 또는 스크립트가 매월 마지막 파일을 임시 디렉터리로 이동하고 모든 내용을 삭제한 다음 파일을 다시 넣을 수 있습니다.

하지만해당 달의 마지막 파일을 무시하도록 간단히 지시 rm(또는 findand awk및 rm 사용) 할 수 있는 방법이 있는지 궁금합니다 .sort그런 마법이 있는 걸까요?

저축할 수 있다면 삶이 더 편해질 것이라는 걸 나는 깨달았어요첫 번째 파일매월 시작(데이터 저장 시점으로부터 1시간 간격)마지막월별 파일) 그러나 조직의 다른 사람들은 이것이 본질적으로 동일한 보호를 제공한다는 것을 알지 못하기 때문에 이를 받아들일 수 없습니다.

답변1

zz 파일에 파일 이름 목록이 포함되어 있으면 작동하므로 cat zz를 바꾸십시오.

cat zz | grep -vF -f <(cat zz|sort -r|uniq -w11)

예를 들어 echo *.sql | grep -vF -f <( echo *.sql | sort -r | uniq -w11 ) |

실제로 파일 이름에 공백이 있으면 작동하지 않으며 파일 이름 길이가 매우 약합니다.

답변2

스크립트에서 빠르고 추악한 무차별 대입 시도(한 줄로 수행할 수 있지만 두 개의 for 루프가 필요하므로 한 줄에서는 약간 추악함)

#! /bin/bash

for year in {2012..2013}
do
   for month in {01..12}
   do
      ls db_"$year"-"$month"*.sql 2>/dev/null | sort -r | tail -n +2 | xargs rm -f
   done
done

물론 이것은 파일 이름에 특수 문자/공백이 없다고 가정합니다. 이는 귀하의 경우인 것 같습니다.

답변3

사용리처드의지난 달을 제외한 모든 항목을 삭제하는 아이디어:

rm -f `ls *.sql | sort | uniq w11 -D -u`

제거될 항목을 확인하려면 다음을 수행하세요.

ls *.sql | sort | uniq w11 -D -u

답변4

나는 이것을 위해 find를 사용할 것입니다.

비슷한 것find "path" -type f -mtime +30 -exec rm {} \;

-mtime +30은 30일을 의미하지만 필요에 따라 쉽게 변경할 수 있습니다.

편집하다 또는 mv를 사용하여 편리한 위치로 이동하는 대신 위의 스크립트를 사용하여 cron 작업을 설정할 수 있습니다.

관련 정보