Linux에서 파일 이름의 일부로 날짜 스탬프가 포함된 파일을 삭제하는 더 깔끔한 방법

Linux에서 파일 이름의 일부로 날짜 스탬프가 포함된 파일을 삭제하는 더 깔끔한 방법

30일이 지난 MySQL 덤프 파일을 제거해야 하는 새로운 요구 사항이 있습니다. 이러한 파일은 "all-mysql-YYYYMMDD-HHMM.dump" 명명 규칙을 사용합니다. 파일은 SAN 마운트 파일 시스템에 있으므로 복구는 문제가 되지 않습니다. 하지만 불행하게도 드라이브 공간이 제한되어 있고 빨리 채워져 자주 수동 개입이 필요합니다.

파일 이름 예시

  • 모든-mysql-20130324-2330.dump
  • 모든-mysql-20130325-2330.dump
  • 모든-mysql-20130326-2330.dump

내 첫 번째 생각은 -mtime +30을 사용하여 배치 스크립트에서 "찾기"를 사용하는 것이었지만 수정 시간은 보장되지 않으며 일부 오래된 아카이브는 제거 날짜를 벗어날 수 있습니다 :)

다음 BASH 스크립트를 만들었지만 이 작업을 수행하는 더 깔끔한 방법이 있기를 바랐습니다.

#!/bin/bash

STARTING_DIR=$(pwd)

FILE_PREFIX=all-mysql-
BACKUP_DIR=/opt/backup/mysql/dumps
ARCHIVE_WINDOW_DAYS=30

cd $BACKUP_DIR

# Create YYYYMMDD datestamp for Today - $ARCHIVE_WINDOW_DAYS
ARCHIVE_WINDOW_IN_SECS=$(echo "$(date +%s) - (${ARCHIVE_WINDOW_DAYS} * 86400)" | bc)
PURGE_BEFORE_DATE=$(date -d @${ARCHIVE_WINDOW_IN_SECS} +%Y%m%d)

for backup_file in $FILE_PREFIX*
do
    # Trim prefix, time portion of date stamp, and file extension
    # from $backup_file to allow numeric comparison against YYYYMMDD
    backup_trim_tmp=${backup_file#${FILE_PREFIX}}
    backup_trimmed=${backup_trim_tmp%-****.dump}

    if [ ${PURGE_BEFORE_DATE} -gt ${backup_trimmed} ]
    then
        rm $backup_file
    fi
done

cd $STARTING_DIR

답변1

마지막 30개 파일을 제외한 모든 파일을 삭제하는 또 다른 방법:

rm $(ls -r | tail -n +31)

또는 원래 게시물의 더 짧은 버전의 스크립트는 다음과 같습니다.

cd /opt/backup/mysql/dumps
d=$(date -r $(($(date +%s)-30*86400)) +%Y%m%d)
for f in all-mysql-*; do
    [[ ${f#all-mysql-} < $d ]] && rm $f
done

답변2

마지막 30개 파일을 제외한 모든 파일을 삭제하려면:

rm `echo " " all-mysql-*.dump | sed -r -e 's/( [^ ]+){0,30}$//'`

하루에 하나의 백업이 있고 이름 지정 체계가 그대로 유지되는 경우(예: 알파벳 순서 = 시간순, 파일 이름에 공백 없음), 이는 요구 사항을 충족합니다.

귀하는 귀하의 의견 중 하나에서 구체적으로 농담을 요청했습니다. 개인적으로 나는 내용을 쓰는 것을 선호합니다. 이 라이너는 약간 위험합니다(sed가 실패하면모든 것삭제되었습니다.)

관련 정보