rsync로 파일을 이동하고 디렉토리를 삭제 하시겠습니까?


17

최근에는 많은 수의 파일 (1 백만 이상)을 삭제해야했으며 그 일을 읽었습니다.

rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source

가장 최적화 된 방법 중 하나였으며보다 빠릅니다 rm -rf.

나는 그 문제에 대한 전문가는 아니지만 rsync 성능의 이유는 파일을 나열하는 방식 (필자가 생각하는 FIFO 대신 LIFO)과 관련이 있습니다. 이제 문제는 효율적인 방법으로 많은 수의 파일을 이동해야한다는 것입니다. 조금 검색 한 후 이것을 찾았습니다.

rsync -av --ignore-existing --remove-source-files ~/source ~/destination

이 모든 이동 삭제하는 동안 파일 에서를 ~/source, 디렉토리가 남아 있습니다. "라운드 로빈"과 같은 디렉토리 구조를 가지고 있기 때문에 수는 files/directories1에 매우 가까우므로 디렉토리를 완전히 제거하려면 첫 번째 명령을 다시 실행해야합니다.

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

직선 mv은 거의 즉시 완료되지만 내 ~/destination디렉토리에는 보관해야 할 파일이 있으므로 mv옵션이 아닙니다. --prune-empty-dirs--forcersync 옵션을 찾았 지만 예상대로 작동하지 않는 것 같습니다.

--force                 force deletion of directories even if not empty
--prune-empty-dirs      prune empty directory chains from the file-list
--remove-source-files   sender removes synchronized files (non-dirs)

한 번에 rsync로 이동 을 모방하는 방법이 있습니까?


2
여기에 답변이 없으면 rsync 목록에 게시하십시오. 그들은 매우 도움이됩니다. lists.samba.org/mailman/listinfo/rsync
Joe

답변:


7

rsync가 "move"인 폴더 삭제? 라는 제목의 스택 오버 플로우 에서이 스레드를 발견했습니다 . 본질적으로 동일한 질문을하고 있습니다. 대답 중 하나는 rsync파일과 소스 디렉토리의 이동 / 제거를 수행 할 수있는 단일 명령이 없기 때문에 in 2 명령을 수행하는 것이 좋습니다 .

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

또는이 명령을 사용하여 수행 할 수 있습니다.

$ rsync -axvvES --remove-source-files source_directory /destination/ && \
  rm -rf source_directory

이상적이지는 않지만 작업을 수행합니다.


그렇습니다. 그 질문에 답한 사람은 저였습니다 (그리고 같은 "해결책"도이 질문에 있습니다). = P
Alix Axel

@AlixAxel-Ha, 미안하지만 당신이 그 답을 알지 못했습니다. 오 잘 이 답변을 삭제해야합니까?
slm

3
사용 rsync자두 디렉토리를하는 것은 옳지과 위험은 항상 존재하지 않습니다 rm -rf. 두 번째 단계는 다음과 같습니다.find source/ -d -type d -exec rmdir {} \;
zany

2
난 그냥 결코 추가하지 사용하도록 강요 느낌 -delete--remove-source-files하나의 rsync를 명령에서 (위의 예는 괜찮,이 접선이다). 설명하고있는 것을 중단했다가 다시 실행하면 전송 된 파일이 손실됩니다. 내가 전에 한 것 :(
Sridhar Sarnobat

로 정리할 때 find나는 이것을 선호합니다 : find source/ -type d -empty -delete 그것은 단지 모든 것을 방해하지 않을 것이라는 이상한 확신을줍니다.
greyfade

10

zany의 의견에서 slm의 답변 ( rsync를 사용하여 파일 이동 및 디렉토리 삭제? ) 까지이 두 가지 명령을 답변으로 권장합니다.

rsync -av --ignore-existing --remove-source-files source/ destination/ && \
find source/ -depth -type d  -empty -exec rmdir "{}" \;

zany가 말했듯이 장점은 rm -rf를 올바르게 사용하지 않거나 초보자에게 사용하면 여전히 위험이 따른다는 것입니다.

나는 -depth와 -empty라는 두 가지 옵션을 추가했으며 이것이 정말로 필요한지 확실하지 않지만 다른 상황에서 두 번째 명령을 더 이식 가능하고 더 안전하게 만듭니다 (일부 디렉토리가 비어 있지 않은 경우 여전히 올바른 일을합니다) 디렉토리 트리에서 가장 깊은 지점에서 제거를 시작합니다)


-delete대신에 -exec rmdir {} \;?
날으는 양

시뮬레이션의 대답에 user7000의 의견을 참조 @flying_sheep : rsync와 IST는 당신이 파일을 풀 수 있었다 중단 할 때
MIT

rsync가 중단되면 찾기가 시작되지 않습니까? 따라서 두 번째 rsync의 -delete는 문제가되지 않습니다. 그러나 -delete 또한 파일을 제거합니다. 대신 rmdir은 파일을 삭제하지 않으며 디렉토리 만 삭제합니다. (-delete 및 rmdir) 모두 삭제하기 전에 디렉토리가 비어 있는지 확인합니다.
benba

또한 매뉴얼 페이지에서 u는 -exec 대신 -execdir을 사용해야한다고 말합니다.
benba

2

이것은 한 단계로 작업을 수행합니다. 소스 및 대상 경로 모두에서 후행 / 슬래시 /에 유의하십시오.

rsync \
    -ruval \
    --ignore-existing \
    --remove-source-files \
    --prune-empty-dirs \ 
    /source/path/ /target/path/

나는 user7000에서 사용하지 않을에주의를 에코 --delete--remove-source-files함께 동일한 호출 rsync. 작업이 실패하거나 중단되고 동일한 호출이 반복되면 데이터가 손실됩니다. 확실 하지 않은 경우 --dry-run옵션을 사용하여 수행 할 작업을 확인하십시오.


-ruval중복되는 것 같습니다. -a은와 동일하며 -rlptgoD, 모두 -r와 를 포함합니다 -l.
greyfade
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.