rsync를 사용하여 소스에 있는 파일 삭제

rsync를 사용하여 소스에 있는 파일 삭제

서버 "A" 에 폴더가 있습니다 ./delete.

./stuff서버 "A"의 폴더에 존재하는 서버 "B"의 폴더에 있는 ./delete모든 항목을 삭제하고 싶습니다 .

rsync의 역과정과 같습니다. 에서 로 파일을 전송하는 것이 아니라 서버 "B"의 두 위치에 있는 모든 파일을 삭제하고 싶습니다 a:/delete.b:/stuff

--delete-on-destination깃발 같은 거요.

답변1

rsync와 같은 파일 복사 도구는 파일을 복사하고 싶지 않기 때문에 쉽게 도움이 되지 않습니다.

대부분의 경우 서버 A에 파일을 나열하고 서버 B에서 해당 파일을 삭제하는 간단한 방법이 좋은 접근 방식입니다. 서버 findxargs명령이 널 구분 기호(Linux, *BSD, Cygwin)를 이해하는 경우 임의의 파일 이름을 처리하는 것이 더 쉬울 것입니다. A에서:

cd ./delete
find . ! -type d -print0  | ssh B 'cd /path/to/stuff && xargs -0 rm -f'

이로 인해 일부 빈 디렉토리가 남을 수 있습니다. 모든 빈 디렉터리를 삭제할 수 있습니다(이전에 비어 있던 디렉터리도 포함).

ssh B 'cd /path/to/stuff && find . -depth -type d -exec rmdir {} + 2>/dev/null'

원본에 존재하는 디렉터리만 삭제하려면 목록을 다시 사용해야 합니다.

find . -depth -type d -print0  | ssh B 'cd /path/to/stuff && xargs -0 rmdir'

B에 존재하지 않는 많은 수의 파일이 포함된 A의 디렉터리 트리가 있는 경우 전체 파일 목록이 삭제를 위해 전송되는 반면, rm -rfB의 신중하게 선택된 디렉터리 트리는 B에서 로컬로 동일한 작업을 수행합니다. 전송 대역폭이 많이 절약됩니다. 이 경우 파일 동기화 도구가 작동합니다. 실행 rsync -nv하고 출력을 구문 분석해 볼 수 있지만 이를 기반으로 신뢰할 수 있는 것을 구축하는 것은 쉽지 않습니다.

답변2

나도 똑같은 일을 하고 싶었고 이를 위해 루비 스크립트를 작성하기로 결정했습니다.

여기 있어요:

https://github.com/saizai/utils/blob/master/rm_dupes_from.rb

답변3

rsync가 문제를 해결할 수 없다고 생각합니다. 하지만 다른 동기화 도구가 도움이 될 수도 있습니다. 보세요일관된.

Unison에는 많은 기능이 있으며 서로 다른 컴퓨터에 있는 두 폴더를 동기화할 수 있습니다. Unison은 매력적인 함수형 언어인 OCaml로 작성되었습니다.

Rsync는 단방향 동기화 도구입니다. Unison은 양방향 동기화 도구입니다.

관련 정보