rsync : 권한이없는 파일을 건너 뜁니다


16

rsync -rlptD다른 사용자의 디렉토리를 복사하는 데 사용 하고 있습니다. 복사 권한이없는 파일이 몇 개 있습니다 (미리 알 방법이 없습니다). rsync가 이것을 무시하는 방법이 있습니까? 문제는 rsync가 0이 아닌 값을 반환하면 내 bash -x 스크립트가 종료된다는 것입니다.


Rsync는 종료 값을 잘 문서화했습니다. 당신의 상황이 실패를 요구하지 않는다면 그것들을 모두 실패로 취급해서는 안됩니다.
jordanm

@jordanm 그러나이 오류 만 정확하게 지적 할 수있는 오류 코드는 없습니다.
Gilles 'SO- 악마 그만해'

답변:


7

Rsync에는 이에 대한 옵션이 없습니다. 두 가지 해결책이 있습니다. 하나는 rsync 오류 메시지를 구문 분석하는 것입니다. 이것은 매우 강력하지 않습니다. 다른 하나는 읽을 수없는 파일 목록을 생성하여 필터링하는 것입니다.

cd /source/directory
exclude_file=$(mktemp)
find . ! -readable -o -type d ! -executable |
  sed -e 's:^\./:/:' -e 's:[?*\\[]:\\1:g' >>"$exclude_file"
rsync -rlptD --exclude-from="$exclude_file" . /target/directory
rm "$exclude_file"

find이없는 경우 적절한 지침으로 대체하십시오 .-readable-executable-perm

이름에 개행이 포함 된 읽을 수없는 파일이 없다고 가정합니다. 이것에 대처해야한다면, 널로 구분 된 파일 목록을 다음과 같이 생성하고 -0옵션을 rsync다음으로 전달해야합니다 .

find . \( ! -readable -o -type d ! -executable \) -print0 |
  perl -0000 -pe 's:\A\./:/:' -e 's:[?*\\[]:$1:g' >>"$exclude_file"

이것은 아마도 그의 최선의 방법입니다. 바라건대, 그는 stat()모든 파일을 두 번 (rsync를 통해 한 번 찾고 find를 통해 한 번) 두 번하는 것이 꽤 나쁘기 때문에 이것을 한 번만 실행하면 됩니다.
jordanm 2013

@Gilles 숨겨진 파일을 제외하고는 작동하는 것 같습니다. 동일한 전략이 약간의 조정으로 작동한다고 가정합니다. 나는 \에 익숙하지 않다! (슬래시 느낌표) 설명 할 수 있습니까?
JeffCharter

1
@JeffC 는 셸 확장으로부터 보호하기 위해 운영자를 \!인용합니다 !. 백 슬래시는 !공백이 뒤따를 때 확장 되는 쉘이 없기 때문에 실제로는 필요 하지 않지만 아프지 않습니다. 숨겨진 파일에 어떤 문제가 있습니까?
Gilles 'SO- 악마 그만해'

3

이 특정 상황에 대한 간단한 해결 방법을 만들었습니다.

rsync --args || $(case "$?" in 0|23) exit 0 ;; *) exit $?; esac)

이 반환 0반환 코드가 0 또는 23, 반환 기타의 경우 종료 코드 인 경우.

그러나 이것은Partial transfer due to error 코드에서 나오는 모든 것을 잡을 수 있기 때문에 권한 오류뿐만 아니라 모든 오류를 무시 한다는 점에 유의해야 합니다 23. rsync 상태 코드에 대한 자세한 내용은 이 링크 를 참조하십시오 .

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