다음과 같은 디렉토리 구조가 있습니다.
/backups/
/backups/db/
/backups/db/01.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz
/backups/db/02.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz
/backups/db/03.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz
/backups/db/04.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz
이제 다음 명령을 실행합니다.
find /backups/db/ -mindepth 1 -mtime +2 -delete && rsync ...
이 명령을 셸에서 직접 실행하면 작동하고 결과는 다음과 같습니다.
/backups/
/backups/db/
/backups/db/03.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz
/backups/db/04.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz
cronjob을 통해 이 명령을 실행하면 디렉터리가 삭제되지 않고 결과는 다음과 같습니다.
/backups/
/backups/db/
/backups/db/01.01.2020/
/backups/db/02.01.2020/
/backups/db/03.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz
/backups/db/04.01.2020/domain_a.sql.gz, domain_b.sql.gz, domain_c.sql.gz
이는 find
이 (2) 폴더의 파일이 먼저 삭제되고 이 작업으로 인해 해당 폴더의 날짜가 변경되어 더 이상 -mtime +2
.
해결책이 있나요? 내 말은, 나는 이런 일에는 괜찮지만, 필요하지 않다면 일반적으로 rm으로 작업하는 것을 좋아하지 않는다는 것입니다.
find /backups/db/ -mindepth 1 -mtime +6 -type d -exec rm -r {} +
찾기(GNU findutils) 4.7.0-git
답변1
이 작업은 두 단계로 수행하고 제거만 수행하는 것이 좋습니다.문서첫 번째 단계:
find /backups/db -mindepth 1 -type f -mtime +2 -delete
그런 다음 빈 디렉터리를 삭제합니다.
find /backups/db -mindepth 1 -type d -empty -delete
이렇게 하면 디렉터리의 타임스탬프를 전혀 비교할 필요가 없습니다.
이 두 가지 작업을 다음과 같이 결합할 수 있습니다.
find /backups/db -mindepth 1 \
\( \( -type f -mtime +2 \) -o \
\( -type d -empty \) \) -delete
-delete
...하지만 먼저 올바른 일을 하고 있는지 확인 하고 싶을 수도 있습니다 .