7일이 지난 디렉터리 삭제

7일이 지난 디렉터리 삭제

나는 내 디렉터리에 매일 백업 파일을 만듭니다.

2020-04-01
2020-04-02
2020-04-03

이전 디렉토리와 그 내용을 삭제하는 코드를 작성하는 방법. 지금까지 디렉토리를 삭제하는 아래 코드가 있지만 충분히 똑똑하지 않습니다. 한 디렉토리에서 다른 디렉토리로 파일을 복사하면 수정 날짜가 변경됩니다.

find ~/delete/* -type d -ctime +6 -exec rm -rf {} \;

답변1

디렉토리 이름으로 디렉토리를 삭제하려면 다음을 수행하십시오 bash.

#!/bin/bash

shopt -s nullglob
date=$(date -d '-7 day' '+%F')
for path in ~/delete/[0-9][0-9][0-9][0-9]-[01][0-9]-[0-3][0-9]; do
  if [[ -d $path && ${path##*/} < $date ]]; then
    echo rm -rf "$path"
  fi
done

이는 YYYY-MM-DD 패턴과 일치하는 경로 이름을 반복하고 디렉토리가 아니고 이름이 현재 날짜(7일 전) 이전에 사전순으로 정렬되지 않은 디렉토리를 건너뜁니다.

활성화 되면 nullglob일치하는 파일/디렉토리가 없고 루프 내의 코드가 실행되지 않는 경우 경로 이름 패턴이 빈 문자열로 확장됩니다.

출력이 예상대로 나타나면 echo스크립트를 삭제하고 다시 실행하여 실제로 디렉터리를 삭제하세요.

답변2

실제로 타임스탬프를 사용할 수 없고 이름을 신뢰해야 하기 때문에 제목이 약간 오해의 소지가 있습니다.

가능한 해결책

keepAfter=$(date -d '-6 days' +'%F')
for d in */
do 
    [[ "$d" < "$keepAfter"/ ]] && echo rm -rf $d 
done

echo결과에 만족하면 삭제

답변3

또 다른 해결책:

d=/path/to/deleted;
printf '%s\n' $d/*/ | awk -v upTo="$d/$(date -d '-6 days' +%F)" '$0<=upTo {print}' | xargs rm -r 

느린:

  • printf '%s\n' $d/*/각 줄이 하위 디렉터리인 스트림을 생성합니다. /path/to/deleted(이 줄에는 전체 경로가 포함되어 있습니다 /path/to/deleted/2020-04-12.)
  • 이는 awk다음으로 전달됩니다.

    • -v upTo="$d/$(date -d '-6 days' +%F)"upTo: 삭제할 가장 최근 디렉터리인 변수를 만듭니다 (전체 경로 포함 /path/to/deleted/2020-04-12).
    • '$0<=upTo {print}'awk사전순으로 내용보다 작거나 같은 입력 줄만 인쇄하는 프로그램 이므로 upTo휴식 날짜 이후의 디렉터리를 필터링합니다.
  • xargs rm -rrm -r표준 입력(즉, 필터링되지 않은 디렉토리)에서 오는 모든 행에 적용됩니다 .

이 코드의 장점은 쉘 루프가 없고 rm모든 디렉토리에 대해 한 번만 호출할 수 있다는 것입니다.

먼저 수행 하면 cd /path/to/deleted코드가 조금 더 간단해집니다 (더 이상 $d변수가 필요하지 않음).

printf '%s\n' */ | awk -v upTo="$(date -d '-6 days' +%F)" '$0<=upTo {print}' | xargs rm -r 

관련 정보