2일이 지난 디렉터리와 해당 내용을 삭제해야 하는 스크립트를 만들었습니다. 스크립트는 제대로 작동하지만 디렉터리는 삭제되지 않습니다. 도와주세요. 정말 감사하겠습니다.
스크립트 세부정보:
export BACKUP_SETS=/backupset/
if [ ! -d "$BACKUP_SETS" ]; then
# Control will enter here if $DIRECTORY doesn't exist.
printf "\nFailure when removing BACKUP_SETS, Exiting \n"
exit 1
else
two_days=$(date -d "2 days ago" +%Y_%b_%d)
for f in $BACKUP_SETS[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]; do
[ -d "$f" ] || continue
(( $f < $two_days )) && echo rm -r "$f"
done
printf "\n BACKUP_SETS was removed successfully.\n"
fi
이 디렉터리에는 아래와 같은 폴더가 포함되어 있습니다.
[oracle@ backupset]$ ls -lrt
total 12
drwxr-xr-x 2 oracle dba 12288 Jul 23 18:32 2018_Aug_23
스크립트 출력:
[oracle@ backupset]$ ./backupset.sh
BACKUP_SETS was removed successfully.
답변1
와일드카드 가 $BACKUP_SETS[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
디렉터리 이름과 일치하지 않습니다 2018_Aug_23
.
디렉터리 이름을 지정하면 20180823
스크립트에서 이를 볼 수 있습니다. 또한 이름이 지정된 월은 올바르게 비교되지 않습니다( Apr
< Mar
).
디렉터리 이름을 더 읽기 쉽게 만들려면 디렉터리 이름을 지정 2018-08-23
하고 와일드카드 문자를 사용할 수 있습니다 $BACKUP_SETS[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]
.
답변2
의견에서 언급했듯이 다음 <
을 사용하여 월 이름을 비교할 수 없습니다.
(( '2018-Aug-29' < '2018-Feb-28' )) && echo 'Uh oh, August is before February' || echo 'Sanity prevails'
Uh oh, August is before February
날짜 문자열을 어휘적으로 비교하려면 YYYY-MM-DD 형식을 사용하는 것이 좋습니다.
그러나 더 나은 접근 방식은 다음을 find
사용하여 이전 디렉터리를 삭제하는 것입니다.
find "$BACKUP_SETS" -mindepth 1 -maxdepth 1 -type d -mtime +2 -print -exec echo rm -rf {} \;
말할 필요도 없이 echo
실제로 실행하고 싶다면 삭제하세요.
답변3
find "$BACKUP_SETS" -type f -mtime +2 -exec rm {} \;
find "$BACKUP_SETS" -type d -mindepth 1 -mtime +2 -exec rmdir {} \;
이 디렉터리는 며칠 후에 최신 파일과 함께 삭제됩니다.