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/