--force 옵션을 사용하더라도 rsync '빈 디렉토리를 삭제할 수 없습니다'오류


28

이 명령을 실행할 때 :

$ sudo rsync -r --delete --force --checksum --exclude=uploads /data/prep/* /data/app/

다음과 같은 결과가 나타납니다.

cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor
cannot delete non-empty directory: html/js/ckeditor/_source/plugins
cannot delete non-empty directory: html/js/ckeditor/_source/plugins
cannot delete non-empty directory: html/js/ckeditor/_source
cannot delete non-empty directory: html/js/ckeditor/_samples
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor

man rsync그것을 읽은 결과, --force옵션이 rsync에게 비어 있지 않은 디렉토리를 삭제하도록 지시하는 것이 인상적이었습니다 . 이는 원하는 결과입니다.

참조 :

--force                 force deletion of dirs even if not empty

비어 있지 않은 디렉토리를 삭제하도록 명령을 수정하려면 어떻게해야합니까?

관련이있는 경우 Gentoo Base System 릴리스 2.0.3에서 rsync 버전 3.0.8을 사용하고 있습니다.

업데이트 :sudo 파일 권한 문제가 아님을 분명히하기 위해 명령에 추가되었습니다 .


대상은 어떤 파일 시스템입니까? 파일 시스템을 복구해야합니까?
Marcus Downing

파일 시스템은 ext3입니다. 파일 시스템이 필요하거나 복구되었을 수 있습니다. fsck다음 기회에 결과를 업데이트 하겠습니다 .
tommarshall

방금 fsck시스템을 만들었고이 문제는 여전히 존재합니다.
tommarshall

답변:


39

추가하려고 했습니까 --delete-excluded?

"원격"쪽의 제외 된 폴더에서 디렉토리를 rsync --delete삭제하면 "로컬"사이트의 제외 된 폴더는 삭제되지 않습니다.


라는 폴더가 있었다 uploadshtml/js/ckeditor/_source/plugins/uicolor/yui, html/js/ckeditor/_samples그리고 html/js/ckeditor/plugins/uicolor/yui디렉토리. 당신의 도움을 주셔서 감사합니다.
tommarshall

사용 --delete-excluded하지만 여전히 특정 파일 / 디렉토리를 삭제에서 제외하려면 다음과 같은 파일 / 디렉토리를 넣을 수 있습니다 --filter 'protect some_dir/'.rsync -ac --delete --delete-excluded --exclude '*.html' --filter 'protect .git/' . /target/destination/
alexandre1985

6

이 문제의 가능한 원인은 다음과 같습니다.

(1) 이 오류는 -b (-backup) 옵션 의 결과 일 수 있습니다 . 이 옵션은 파일 이름에 물결표 ( ~ )를 추가하여 삭제 된 각 파일의 백업을 만듭니다 . (file-name은 분명히 백업이지만, 물결표를 볼 수 없기 때문에 디렉토리 이름은 아닙니다.)

이것이 동일한 지 확인하려면 대상 디렉토리를 가장 깊은 레벨에서 읽고 물결표 (~) 끝 파일이 있는지 확인하십시오. 이러한 물결표 추가 파일 이름은 일부 일반적인 파일 찾아보기 시스템에서 보이지 않으므로 표시되지 않을 수 있습니다.

이 경우를 해결하려면 --backup-dir = DIR 옵션을 선호하십시오 (예 : --backup-dir = .rsync_bak).

(2) --exclude 옵션은 동일한 결과를 가질 수 있습니다. 귀하의 경우에는 아마도 일어날 것입니다. 패턴 시스템은 강력하지만 오해의 소지가 있습니다. 예를 들어 --exclude = '* ~'를 작성하면 위의 (1)과 같이 모든 물결표 끝 파일을 건너 뜁니다.

rsync 매뉴얼 페이지에서 :

패턴이 /로 시작하면 파일 계층 구조의 특정 지점에 고정되고, 그렇지 않으면 경로 이름의 끝과 일치합니다.

Si --exclude = uploads를 쓰면 파일 트리의 모든 레벨 에서 "updloads"라는 이름의 모든 파일이 제외됩니다 .

삭제할 수없는 디렉토리 내에 "업로드"라는 파일이 있는지 확인하십시오.

해결책은 "--exclude = uploads"를 "--exclude = uploads /"로 변경하는 것입니다.


0

내 설정 (소스는 Western Digital 유형 fuseblk를 대상으로하는 Ubuntu 형식 유형 ext4)에서 작동합니다.

rsync -a -v --progress --modify-window=1 -c -b -i -s -m --del -vv --ignore-errors --chmod=ugo=rwx --delete --delete-excluded  --exclude='*~'  --exclude='.*' --backup-dir=.rsync_bak /home/test /media/user/usbHDD

2
이 중 어느 부분이 실제로 문제를 해결합니까?
Michael Hampton

0

대신 필터 파일에 규칙을 사용하십시오 --exclude. 이를 통해 제외를 "지속 가능"으로 표시하면 제외 된 파일이 포함 된 비어 있지 않은 디렉토리를 삭제할 수 있습니다.

자세한 내용은 이 답변 을 참조하십시오.


-1

디렉토리를 삭제하려면 디렉토리가 비어 있어야합니다. 파일 시스템에는 일반적으로 필요합니다.

따라서 일반적으로 rsync또는 rm모든 내용을 재귀 적 으로 먼저 삭제 한 다음 now-empty 디렉토리 만 삭제하십시오.

현재 사용자가 모든 파일의 소유자가 아닌 경우 파일 시스템 권한으로 해당 파일을 삭제할 수 없습니다. 제거되지 않기 때문에 디렉토리가 비워지지 않으며 삭제에 실패합니다.

내 첫 번째 추측은 그 디렉토리의 일부 파일이 다른 사용자, 예를 들어 아파치 또는 nobody 사용자가 소유하고 있다는 것입니다.


감사. 디렉토리 내의 파일은 아파치 그룹 내의 사용자가 실제로 소유하고 있지만 방금 해당 사용자로이 명령을 실행하려고 시도했지만 동일한 오류가 발생했습니다.
tommarshall

또한 파일 권한 문제인 경우 'sudo'와 동일한 명령을 실행하여 문제를 해결할 것으로 예상되지만 그렇지 않습니다. 그러나 내가 실수하면이 문제를 해결하십시오.
tommarshall

1
명령을 루트로 실행하면 대부분의 권한 문제를 극복해야합니다. (아직도 실패 할 수있는 곳은 nfs 마운트에 하나, 불변 파일을 다른 이름으로 지정하는 것입니다) ls -la디렉토리가 여전히 비어 있지 않은 이유를 확인하는 간단한 점검 . lsattr불변 파일을 표시합니다.
HBruijn

추가 정보에 감사하지만 lsattr나열된 디렉토리 중 하나에서 다음을 출력합니다. --------------- ./assets(i 플래그 없음) 파일이 nfs 마운트에 없습니다. 명령이 여전히 sudo로 실패하는 이유를 생각할 수있는 다른 이유가 있습니까?
tommarshall

거기에 심볼릭 링크가 있거나 실제 파일이 있습니까?
Marcus Downing
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.