디렉터리 이름을 기준으로 이전 디렉터리를 삭제하시겠습니까?

디렉터리 이름을 기준으로 이전 디렉터리를 삭제하시겠습니까?

내 Bash 스크립트에서는 다음과 같이 매달 백업용 디렉터리를 만듭니다.

DAY=$(date -d "$D" '+%d')
MONTH=$(date -d "$D" '+%m')
YEAR=$(date -d "$D" '+%Y')

mkdir -p /var/app/backup/$DAY$MONTH$YEAR

예를 들어 다음과 같은 결과를 얻습니다.

 01012000
 01022000
 01032000
 .
 .
 01012014
 01022014
 01032014
 01042014
 .
 .

수년 후에 우리는 반년이 넘은 디렉토리를 삭제하려고 합니다. 예를 들어 2015년 1월 1일 01012000까지 의 디렉터리는 01062000삭제되어야 합니다.

디렉토리 이름에 날짜가 있는 경우 bash 스크립트에서 반년보다 오래된 디렉토리를 삭제하는 가장 좋은 방법은 무엇입니까?

답변1

파일 이름을 직접 비교할 수 있는 이름(예: Unix 타임스탬프(에포크 이후 초) 또는 YYYYMMDD사전순으로 정렬할 수 있는 이름)으로 변환한 다음 6개월보다 오래되었는지 확인할 수 있습니다.

예를 들어 다음과 같은 스크립트(예: at /path/to/compare.sh)는 다음과 같습니다.

#! /bin/bash

LAST=$(date -d '6 months ago' +%s)

for FILE
do
    NAME=$(basename $FILE)
    DATE=$(perl -pe 's/(\d{2})(\d{2})(\d{4})/$3$2$1/' <<<$NAME)
    if (( $(date -d "$DATE" '+%s') < $LAST ))
    then
        rm -r $FILE
    fi
done

그리고 다음을 수행하십시오:

/path/to/compare.sh /var/app/backup/*

여기서는 이를 초로 변환합니다. 전자를 유효한 날짜로 받아들이지 않았기 때문에 DDMMYYY일정 을 변경해야 했습니다 . 따라서 초로 변환하는 것은 중복되지만 전자가 왜 거부되는지 잘 모르겠습니다 (로케일 문제일까요?).YYYYMMDDdatedate

답변2

귀하의 질문에서 삭제된 부분에 집중하겠습니다. 다음과 같은 파일 이름 목록이 있는 경우:

$ cat data.txt
01012000
01022000
01032000
01012014
01022014
01032014
01042014

6개월 기한이 '01022014'인 것을 알고 계시나요? 다음과 같이 sort&를 사용하여 sed삭제해야 할 파일을 결정할 수 있습니다.

이렇게 하면 파일이 역순으로 정렬됩니다.

$ sort -r data.txt 
01042014
01032014
01032000
01022014
01022000
01012014
01012000

이렇게 하면 마감 날짜인 "01022014"까지의 모든 최신 파일이 삭제됩니다.

$ sort -r data.txt | sed '1,/01032000/d'
01022014
01022000
01012014
01012000

노트: sed '1,/PATTERN/d'PATTERN이 나타날 때까지 첫 번째 줄부터 시작하여 d나타나는 모든 줄을 삭제합니다.1,

마지막으로 삭제를 위해 목록을 보낼 수 있습니다 xargs.

$ sort -r data.txt | sed '1,/01032000/d' | xargs rm

답변3

범위 중괄호 확장을 사용할 수 있습니다.

6개월마다 삭제:

echo /path/to/directories/01{01..06}{2000..2014}

또는 지난 반년을 제외한 모든 항목을 삭제합니다.

echo /path/to/directories/01{01..12}{2000..2013}
echo /path/to/directories/01{01..06}2014

경로를 echo다음으로 바꾸고 업데이트합니다.rm -r

관련 정보