백업 파일에 스크립트를 작성하고 오래된 백업을 삭제합니다.
#!/bin/sh
BACKUPDIR=/var/backups/files
ROTATE=1
mkdir -p $BACKUPDIR
CURRENT="$BACKUPDIR/`date +%Y-%m-%d`-files.tar.gz"
cd /var/ && tar czf $CURRENT www
find $BACKUPDIR -type f -mtime $ROTATE -exec rm {} \;
chmod 0600 $BACKUPDIR/*
명령줄(테스트용):
find $BACKUPDIR -type f -mtime $ROTATE -exec rm {} \;
어떻게 든 스크립트가 작동하지 않습니다. 하지만 콘솔에서 실행하면 모든 것이 잘 작동하고 이전 파일이 삭제됩니다. 그러나 스크립트를 실행하면 파일이 삭제되지 않습니다(스크립트를 실행할 때 tar 아카이브가 생성됨). 왜?
스크립트 권한은 입니다 755
.
답변1
Fiximan이 제안한 대로 이 옵션을 사용하고 싶을 수도 있지만 -delete
, 귀하의 경우에는 거의 영향을 미치지 않지만 공백이나 기타 특수 문자가 포함된 파일 이름을 입력하면 스크립트가 실패합니다 .
#!/bin/sh -e
BACKUPDIR=/var/backups/files
# I suggest a little more than 1 day (i.e. about 1 week of backups is
# probably safer.)
ROTATE=7
mkdir -p $BACKUPDIR
CURRENT="$BACKUPDIR/`date +%Y-%m-%d`-files.tar.gz"
# Create protected file, then backup data in it
touch $CURRENT
chmod 600 $CURRENT
cd /var/ && tar czf $CURRENT www
# Here we have the attempt at deleting, notice the "+"
find $BACKUPDIR -type f -name '*-files.tar.gz' -mtime +$ROTATE -delete
무엇:
ROTATE=1
별 의미가 없는 것 같습니다. 만약을 대비해 여러 개의 백업을 원할 수도 있습니다. 며칠 내에 문제가 발생하는 것을 종종 발견하게 될 것입니다. 어젯밤의 백업만 가지고 계시다면 행운을 빕니다!chmod 600 $CURRENT
이 작업은 가능한 한 빨리 수행해야 합니다. 파일 보안이 정말로 걱정된다면 타르볼을 생성하기 전에 수행하십시오(내 예에서처럼).숫자 앞에
find
1을 추가하여 수정되었습니다 . 매번 받는 얘기니 기분 나빠하지 마세요. 실제로 사용해보면+
$ROTATE
+
더 오래되었거나 이에 상응하는, "-"를 사용하면 테스트가 취소됩니다(따라서 --mtime +7
와 거의 동일하며! -mtime -7
아마도 1일 이내에 한쪽 또는 다른 쪽과 일치하지 않을 것입니다.) 사용하는 일반 숫자를 사용하십시오(-mtime 1
). 그러면 파일이 삭제됩니다. 특정 날짜에 수정되었습니다. 스크립트가 3일 동안 실행되지 않으면 이 3개 파일은 삭제되지 않습니다.사용하기가 더 쉽기
-delete
때문에 예제 코드에서 누락된 참조를 고려할 필요가 없습니다(예:.-exec rm "{}" \;
파일 이름에 특수 문자가 포함된 경우)-name
문제의 파일이 백업인지 쉽게 알 수 있으므로 추가하는 것이 좋습니다 . 이것은 단지 안전을 위한 것입니다. 이 디렉터리에 다른 파일을 절대 넣지 않는다면(예를 들어 장기간 백업 복사본을 보관하려는 경우) 해당 파일은 필요하지 않습니다.-e
#!/bin/sh -e
스크립트가 첫 번째 오류에서 중지되도록 hash bang()에 옵션을 추가하는 것이 좋습니다. 스크립트가 실행될 때 오류가 발생하지만 표시되지 않는 경우가 있습니다.