마지막 2개의 백업만 유지하고 나머지 디렉터리는 삭제하는 명령을 작성하려고 합니다.
directory path = /apps/
다음은 디렉토리입니다. 여기에 보관하고 싶습니다.
source
source_2020-01-13
source_2019-12-09
디렉토리를 삭제하고 이전 디렉토리를 삭제하세요. 스크립트는 cron을 사용하여 100개 이상의 서버에서 실행됩니다.
여기서 문제는 find
명령에서 이전 디렉터리를 추가하거나 제거할 수 없다는 것입니다 mtime
. 이유는 백업 디렉터리 타임스탬프가 모든 서버에서 동일하지 않기 때문입니다. 기본적으로 명령/스크립트는 source_YYYY_MM_DD라는 마지막 두 개의 백업 디렉터리를 유지하고 나머지는 삭제해야 합니다.
누구든지 도와줄 수 있나요?
노트:소스_YYYY_MM_DD백업 디렉터리입니다.
drwx------ 11 root root 4096 Jul 22 2019 source_2019-07-22
drwx------ 11 root root 4096 Jul 29 2019 source_2019-07-29
drwx------ 11 root root 4096 Aug 5 2019 source_2019-08-05
drwx------ 11 root root 4096 Aug 14 2019 source_2019-08-14
drwx------ 11 root root 4096 Oct 14 2019 source_2019-10-14
drwx------ 11 root root 4096 Dec 9 03:59 source_2019-12-09
drwx------ 11 root root 4096 Jan 13 05:20 source_2020-01-13
drwxr-x--- 12 root root 4096 Apr 21 09:11 source
답변1
ls -d1 /apps/source_20??-??-??/ | head -n -2 | xargs rm -rf
그러면
ls -d1 /apps/source_20??-??-??/
일치하는 디렉터리만 정렬된 순서로 나열되고
head -n -2
마지막 두 항목을 가져온
xargs rm -rf
다음 디렉터리가 삭제됩니다.
답변2
find /apps/ -type d -not -name source -name "source*" -print | sort | head -n -2 | xargs rm -rfv
find apps/ -type d -not -name source -name "source*" -print
모든 백업 디렉토리가 발견되어 명령이 해당 source
디렉토리를 선택하지 않도록 합니다 find
.
sort
최신 항목이 마지막인지 확인하여 정렬됩니다. 이는 수정 시간을 기준으로 하지 않고 디렉터리 이름을 기준으로 합니다.
head -n -2
모든 디렉터리, 마지막 2개의 백업 디렉터리를 가져옵니다.
xargs rm -rfv
이전 명령으로 필터링된 마지막 2개를 제외한 모든 백업 디렉터리를 삭제합니다.
(경고: 디렉터리 이름에 공백이 포함된 경우 이 명령은 작동하지 않습니다. 항상 가짜 디렉터리를 만들고 이 명령을 시도하여 먼저 테스트하십시오.)