스크립트 세부정보:

스크립트 세부정보:

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 {} \;

이 디렉터리는 며칠 후에 최신 파일과 함께 삭제됩니다.

관련 정보