Bash, 오래된 파일 찾기 및 삭제

Bash, 오래된 파일 찾기 및 삭제

백업 파일에 스크립트를 작성하고 오래된 백업을 삭제합니다.

#!/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

무엇:

  1. ROTATE=1별 의미가 없는 것 같습니다. 만약을 대비해 여러 개의 백업을 원할 수도 있습니다. 며칠 내에 문제가 발생하는 것을 종종 발견하게 될 것입니다. 어젯밤의 백업만 가지고 계시다면 행운을 빕니다!

  2. chmod 600 $CURRENT이 작업은 가능한 한 빨리 수행해야 합니다. 파일 보안이 정말로 걱정된다면 타르볼을 생성하기 전에 수행하십시오(내 예에서처럼).

  3. 숫자 앞에 find1을 추가하여 수정되었습니다 . 매번 받는 얘기니 기분 나빠하지 마세요. 실제로 사용해보면+$ROTATE+더 오래되었거나 이에 상응하는, "-"를 사용하면 테스트가 취소됩니다(따라서 - -mtime +7와 거의 동일하며 ! -mtime -7아마도 1일 이내에 한쪽 또는 다른 쪽과 일치하지 않을 것입니다.) 사용하는 일반 숫자를 사용하십시오( -mtime 1). 그러면 파일이 삭제됩니다. 특정 날짜에 수정되었습니다. 스크립트가 3일 동안 실행되지 않으면 이 3개 파일은 삭제되지 않습니다.

  4. 사용하기가 더 쉽기 -delete 때문에 예제 코드에서 누락된 참조를 고려할 필요가 없습니다(예: -exec rm "{}" \;파일 이름에 특수 문자가 포함된 경우) .

  5. -name문제의 파일이 백업인지 쉽게 알 수 있으므로 추가하는 것이 좋습니다 . 이것은 단지 안전을 위한 것입니다. 이 디렉터리에 다른 파일을 절대 넣지 않는다면(예를 들어 장기간 백업 복사본을 보관하려는 경우) 해당 파일은 필요하지 않습니다.

  6. -e#!/bin/sh -e스크립트가 첫 번째 오류에서 중지되도록 hash bang()에 옵션을 추가하는 것이 좋습니다. 스크립트가 실행될 때 오류가 발생하지만 표시되지 않는 경우가 있습니다.

관련 정보