Rsync --delete 옵션은 대상 디렉토리의 파일을 삭제하지 않습니다


14

원래 디렉토리에없는 대상 디렉토리의 파일을 삭제 하기 위해 --delete옵션 을 사용하려고합니다.rsync

내가 사용하는 명령은 다음과 같습니다.

rsync -avz --ignore-existing --recursive --delete /var/www/* root@mydomaintest.com:/var/www

그래서 내 질문은, 원래 디렉토리에없는 대상 디렉토리의 모든 파일을 어떻게 삭제할 수 있습니까?

답변:


14

이 명령을 사용하십시오 :

rsync --archive --verbose --compress --ignore-existing --delete /var/www/ root@mydomaintest.com:/var/www

"*"가 필요하지 않으며 사용하지 않아야합니다.

파일 또는 디렉토리를 제외 / 포함하려면 다음 매개 변수를 사용해야합니다.

--exclude 'to_exclude*'
--include 'to_include*'

좋아 날이 :) 해보자
user2028856

2
--delete 명령이 작동하지 않는 "*"입니까?
user2028856

2
그 모양입니다. :)
AB

3
--recursive옵션에 -a이미 포함되어 있기 때문에 과잉입니다
Temak

1
"*"는 "."로 시작하는 파일 / 디렉토리를 제외하기 때문에 어떤 경우에는 중요 할 수 있습니다. 예를 들어 rsync를 사용하여 git에서 유지 관리되는 디렉토리를 개발 시스템에서 프로덕션 시스템으로 복사 할 때 사용합니다. .git 저장소 디렉토리 또는 .gitignore와 같은 파일, 하위 트리뿐만 아니라 최상위 레벨의 파일을 포함하여 작업 트리 만 동기화하고 싶지 않습니다.
sootsnoot

14

사용할 때 명령이 작동하지 않았습니다. /var/www/*소스 쉘이 그루브를 수행 쉘이 *해당 디렉토리의 모든 파일로 확장 하고 파일을 하나씩 복사 개별 파일이 아닌 소스가되었습니다. 부모 디렉토리

따라서를 사용하는 경우 파일을 포함하는 상위 디렉토리가 아닌 파일이 내용과 함께 디렉토리와 함께 복사되도록 옵션이 /var/www/*필요하지 않습니다 . 소스에없는 대상 디렉토리 에서 파일을 제거 하는 것과 동일한 이유로 작동 하지 않습니다.--recursive*--delete--delete 디렉토리를 ,하지만 당신은 제거되지 파일 (예상대로) 그래서 파일을 복사합니다.

이렇게하면 더 명확 해집니다.

/foo$ ls -l
-rw-rw-r-- 1 user user    0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user    0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test


/bar$ ls -l
-rw-rw-r-- 1 user user 0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user 0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user 0 Apr 16 17:56 spam


$ rsync -avz --ignore-existing --recursive --delete 
/foo/* /bar/

+ rsync -avz --ignore-existing --recursive --delete 
/foo/egg /foo/spam /foo/test /bar/

sending incremental file list
test/
test/hello

sent 173 bytes  received 39 bytes  424.00 bytes/sec
total size is 0  speedup is 0.00


/bar$ ls -l
-rw-rw-r-- 1 user user    0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user    0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user    0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test

보시다시피, 소스를 사용 /foo/*했으므로rsync 실행중인 명령이

rsync -avz --ignore-existing --recursive --delete /foo/egg 
/foo/spam /foo/test /bar/

* 만드는 쉘을 확장하고 전체가 아닌 상위 디렉토리 소스 인수, 개별적으로 모든 파일을 (당신은 또한 필요하지 않습니다 --recursive이 경우).

따라서 --delete작업하려면 다음과 같이 실행하십시오.

rsync -avz --ignore-existing --recursive --delete 
/var/www/ root@mydomaintest.com:/var/www/

4
실제 문제를 지적하는 훌륭한 설명 : '*'를 사용하여 소스 목록을 확장하십시오.
Antonio Bardazzi

허용 된 답변에 대한 내 의견에서 언급했듯이 *는 "."로 시작하는 파일 및 디렉토리와 같은 것을 제외하는 데 유용 할 수 있습니다. 참고로, 소스의 최상위에서 제거 된 파일 및 디렉토리는 대상 디렉토리에서 제거되지 않습니다. 나 자신을 위해 최상위 파일이 대상에서 올바르게 삭제되는지 여부는 중요하지 않으며 하위 디렉토리 아래의 파일 만 중요합니다. 최상위 서브 디렉토리를 제거하는 것이 디렉토리를 추가하는 것보다 훨씬 적습니다. 그런 경우가 아니라면 대상에서 수동 rm -r을 수행하려고합니다.
sootsnoot
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.