내 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
일정 을 변경해야 했습니다 . 따라서 초로 변환하는 것은 중복되지만 전자가 왜 거부되는지 잘 모르겠습니다 (로케일 문제일까요?).YYYYMMDD
date
date
답변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