나는 내 디렉터리에 매일 백업 파일을 만듭니다.
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 -r
rm -r
표준 입력(즉, 필터링되지 않은 디렉토리)에서 오는 모든 행에 적용됩니다 .
이 코드의 장점은 쉘 루프가 없고 rm
모든 디렉토리에 대해 한 번만 호출할 수 있다는 것입니다.
먼저 수행 하면 cd /path/to/deleted
코드가 조금 더 간단해집니다 (더 이상 $d
변수가 필요하지 않음).
printf '%s\n' */ | awk -v upTo="$(date -d '-6 days' +%F)" '$0<=upTo {print}' | xargs rm -r