-
디렉토리 목록을 정렬 후 상위 N 개의 디렉토리만 남기고 모두 삭제하기bash 2022. 1. 21. 21:27
문제
아래와 같이 backup 디렉토리에 날짜 이름으로 5개의 하위 디렉토리가 있다.
이름순으로 정렬했을 때 가장 최근 디렉토리 2개(20220104, 20220105)만 남기고 모두 삭제하고 싶다.
windbird@AL01929730:~$ ls -l ./backup total 20 drwxr-xr-x 2 windbird windbird 4096 Jan 21 21:14 20220101 drwxr-xr-x 2 windbird windbird 4096 Jan 21 21:14 20220102 drwxr-xr-x 2 windbird windbird 4096 Jan 21 21:14 20220103 drwxr-xr-x 2 windbird windbird 4096 Jan 21 21:14 20220104 drwxr-xr-x 2 windbird windbird 4096 Jan 21 21:14 20220105
코드
디렉토리 이름으로 역순으로 정렬하면
20220105 20220104 20220103 20220102 20220101
상위 2개만 남기기 위해서는 3번째 항목 이후부터 삭제 되어야 한다.
3번째 항목 이후를 출력하려면
windbird@AL01929730:~$ find ./backup/ -maxdepth 1 -mindepth 1 -type d | sort -r | tail -n +3 ./backup/20220103 ./backup/20220102 ./backup/20220101
최종적으로 아래 명령으로 삭제할 수 있다.
windbird@AL01929730:~$ find ./backup/ -maxdepth 1 -mindepth 1 -type d | sort -r | tail -n +3 | xargs rm -rf
참고로, 가장 최근 수정된 디렉토리 2개만 남기고 삭제할려면 아래와 같이 한다.
windbird@AL01929730:~$ cd ./backup; find ./ -maxdepth 1 -mindepth 1 -type d | ls -t | tail -n +3 | xargs rm -rf
주의: cron 에 등록하려면 https://serverfault.com/questions/669945/why-cd-does-not-change-current-directory-in-crontab 처럼 괄호로 감싸줘야 한다.
10 1 * * * (cd /home/app/backup; find ./ -maxdepth 1 -mindepth 1 -type d | ls -t | tail -n +3 | xargs rm -rf)
설명
무조건 상위 N 개의 디렉토리를 남긴다는 의미에서, 현재 시간을 기준으로 오래된 디렉토리를 삭제하는 명령어 보다 안전하다.
'bash' 카테고리의 다른 글
프로세스가 실행 중인지 체크 후 실행하기 (0) 2021.10.14 실행되는 스크립트로 부터 프로젝트 홈의 절대 경로 알아내기 (0) 2021.10.13 명령 실행 후 성공이면 진행하고 실패면 exit 하기 (0) 2021.08.04