RSYNC는 소스 디렉토리를 삭제하지 않습니다


27

서버에서 파일을 가져 오기 위해 rsync를 사용하고 로컬에 파일이 있으면 서버에서 파일을 삭제합니다. 내가 실행중인 전체 명령은 다음과 같습니다.

소스 서버 에서 파일 을 성공적으로 삭제 하지만 빈 디렉토리는 여전히 남아 있습니다. 메시지 나 오류가 발생하지 않습니다. 모든 출력은 정상입니다. 아마도 이것은 의도 된 기능 일 것입니다.

디렉토리를 포함하여 모든 것을 정리하도록 rsync에 지시하는 방법은 무엇입니까?

rsync --progress -vrzh --remove-source-files

양쪽 끝의 버전은 3.0.9입니다.


답변:


13

--remove-source-files관찰 한 동작은 다음 과 같이 정확하게 지정됩니다 man rsync.

--remove-source-files

   This tells rsync to remove from the sending side the files (meaning non-directories) that are a part of the transfer and have been successfully duplicated on the receiving side.

StackExchangeServerFault에 대한이 두 가지 논의가 명확하게 표시 되므로 디렉토리를 제거하는 특정 명령이 없습니다 . 이 솔루션은 두 가지 별도의 명령을 실행해야한다고 제안했습니다.

 rsync -av --ignore-existing --remove-source-files source/ destination/ && \
 rsync -av --delete `mktemp -d`/ source/ 

이 두 게시물에서 제안 된 마지막 명령은

 rmdir source/

OP와 응답이 rsync를 사용하여 동일한 시스템 내에서 많은 양의 파일을 이동하기 때문에 (현재 비워진) 소스 디렉토리를 제거하는 데 필요한 게시물은이 게시물 에서이 양식을 갖습니다. 귀하의 경우이 작업을 수동으로 수행해야합니다.


5
rsync --delete제안 그것은 rsync를가 완료되지 않은 가능성을 무시하거나, 소스에서 새 파일이 있기 때문에, 위험하다. find아래 @slhck의 방법이 훨씬 안전합니다.
Sai

29

맨 페이지는 다음과 같이 말합니다.

--remove-source-files   sender removes synchronized files (non-dirs)

소스에서 빈 디렉토리를 제거하려면 여전히 파일이 남아 있으면 다음을 수행하십시오.

find . -depth -type d -empty -delete

그러나 빈 루트 디렉토리 rm -rf <directory>의 경우 물론 의지로 충분합니다.


5
네, 이것이 유일한 해결책입니다. 그것은 rsync의 어리석은 기능 중 하나입니다 ... rsync는 디렉토리의 마지막 파일을 언제 처리했는지 알고 있습니다 ... 비어 있으면 디렉토리를 제거하기도 쉽습니다.
Erik Aronesty 2018 년

4
"rm -rf"를 발행하면 경쟁 조건이 발생하기 쉬우므로 권장하지 않습니다.
Raúl Salinas-Monteagudo

최상위 빈 디렉토리를 지우지 않는 변형 :find some_dir -depth -type d -empty -not -path some_dir -delete
Cameron Tacklind

5

" rm -rf "를 사용하면 고유 한 경쟁 조건이 있습니다. 즉, rsyncrm 호출 간에 방금 작성된 파일을 삭제할 수 있습니다 .

나는 사용하는 것을 선호합니다 :

rsync --remove-source-files-서버 : 수신 / 수신 / &&

ssh 서버는 들어오는 유형을 찾습니다.

디렉토리가 비어 있지 않으면 제거되지 않습니다.


2
rm -rf또한 어떤 이유로 전송되지 않은 파일을 제거합니다.
Kristian

1
이 답변 에는 올바른 순서로 처리 -depth하도록 지시 하는 옵션이 없습니다 find. 이 누락으로 인해 빈 디렉토리 만 포함 된 디렉토리 (재귀 적으로 가능)는 삭제되지 않습니다. @slhck의 변형이 맞습니다.
Stéphane Gourichon

1

-m, --prune-empty-dirs 파일 목록에서 빈 디렉토리 체인 제거

--force 비어 있지 않더라도 다이어리를 강제로 삭제


1
이것은 rsync가 빈 디렉토리를 복사하지 못하게합니다. 빈 디렉토리는 삭제하지 않습니다.
Navin

1

소스 파일을 제거한 다음 안전한 디렉토리를 제거하십시오.

# given this scenario where you generate folders 2014-01-01 etc.. that have an archive myfile.tar.gz
pushd $(mktemp -d)
mkdir 201{4..6}-{01..12}-{01..31}
for i in $(ls); do; touch $i/myfile.tar.gz;done;
# find and rsync on 10 CPU threads directories that match ./2015-*
find /tmp/tmp.yjDyF1jN70/src -type d -name '2015-*' | \
parallel \
--jobs 10 \
--progress \
--eta \
--round-robin \
rsync \
--hard-links \
--archive --verbose --protect-args \
--remove-source-files \
{} /tmp/tmp.yjDyF1jN70/dest
# now safely remove empty directories only
for i in $(ls /tmp/tmp.yjDyF1jN70/src); do; rmdir /tmp/tmp.yjDyF1jN70/src/$i; done;

GNU Parallel 에 대한 추가 정보

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.