rsync를 사용하여 대상 디렉터리(내용 및 상위 디렉터리)를 삭제합니다.

rsync를 사용하여 대상 디렉터리(내용 및 상위 디렉터리)를 삭제합니다.

versions/rsync 데몬과 ftp를 통해서만 액세스할 수 있는 원격 서버에 디렉터리가 있습니다 . 이 디렉터리에는 코드 베이스가 배포된 날짜와 시간(예: 등)의 이름을 딴 일련의 하위 디렉터리가 포함되어 versions/20150101000000/있습니다 versions/20150102120000/. 이전 버전을 자동으로 삭제해야 하는데, 빈 소스 디렉터리를 사용하는 rsync가 ftp를 사용하여 재귀적으로 반복하는 것보다 훨씬 빠르다고 생각합니다. (간단한 작업을 수행하는 데 사용할 수 있는 ftp의 SITE EXEC가 없다는 것을 확인했습니다 rm -rf versions/$version/.)

초기 rsync --list-only명령을 사용하여 버전 목록을 구문 분석하고 정렬한 다음(rsync가 항상 예상 순서대로 목록을 반환하지 않는다는 증거를 보았습니다) 최신 3개 버전을 제외한 모든 버전을 삭제하도록 선택했습니다.

특정 디렉토리를 지우는 명령은 간단합니다.

rsync -vr --delete `mktemp -d`/ rsync://user@host:123/module/versions/$version/

그러나 rsync에서 예상한 대로 최상위 디렉터리 자체는 삭제되지 않습니다. 동기화 중인 디렉터리와 해당 내용의 삭제를 요청하는 방법이 rsync에 있습니까? 그렇지 않으면 // 매개변수의 일부 조합을 사용하여 상위 디렉토리에 대해 동기화를 실행하는 것이 가능해야 한다고 생각 versions/하지만 평생 동안 그것을 알아낼 수는 없습니다.--exclude--include--filter

나는 비슷한 것을 시도했습니다 :

rsync -vr --delete --include=/20150101000000/ rsync://user@host:123/module/versions/

슬래시 유무에 관계없이, 인수 --exclude='*'앞이나 뒤에 나열될 때 --include, --delete-excluded일치 --include--exclude인수에 필요할 때 사용됩니다. 내가 원하는 결과를 얻을 수 있는 것은 아무것도 없는 것 같습니다.

내용을 rsync한 다음 rmdir빈 디렉토리에서 ftp를 사용하여 작업을 완료할 수도 있었지만 rsync만 사용하여 이 작업을 수행할 수 있다는 것을 알 만큼 고집이 세고 해결책을 찾고 싶습니다. 감사해요!

답변1

고집이 좋습니다. 다음이 작동하는 동안 중지하고 대신 로컬 파일로 테스트했습니다 rsync://. 이 작업을 수행하지 않으려면 -n을 사용하고, 수행되는 이유를 보려면 -iv를 사용하십시오. empty로컬 빈 디렉토리입니다. 삭제할 원격 디렉터리 20150101000000도 비어 있어야 합니다.

rsync -nivd --delete --filter='-! /20150101000000' empty/ rsync://user@host:123/module/versions/

답변2

친절한 IRC 담당자 덕분에 rsync단일 명령을 사용하여 특정 디렉터리를 삭제하는 효과적인 솔루션을 찾았습니다. --include디렉터리 내용에 대한 하나의 인수( --include '/20150101000000/**'), --include디렉터리 자체에 대한 별도의 인수( --include '/20150101000000/')를 지정하고 --exclude '*'최상위 디렉터리의 다른 모든 콘텐츠를 무시하는 방식으로 작동합니다 (이 경우 versions/).

rsync -vr --delete --include '/20150101000000/**' --include '/20150101000000/' --exclude '*' `mktemp -d`/ rsync://user@host:123/module/versions/

그런 다음 위의 내용을 완전히 이해하기 위해 매뉴얼 페이지를 파헤쳐 다음 편리한 섹션을 찾았습니다.

후행 "dir_name/***"은 디렉터리("dir_name/"이 지정된 것처럼)와 디렉터리의 모든 항목("dir_name/**"이 지정된 것처럼) 모두와 일치합니다. 이 동작은 버전 2.6.7에 추가되었습니다.

이 정보를 사용하면 이를 단일 매개변수로 줄일 수 있습니다 --include.

rsync -vr --delete --include '/20150101000000/***' --exclude '*' `mktemp -d`/ rsync://user@host:123/module/versions/

관련 정보