--from-files를 사용하는 bash 스크립트의 rsync 명령은 rsync: link_stat 오류를 발생시킵니다.

--from-files를 사용하는 bash 스크립트의 rsync 명령은 rsync: link_stat 오류를 발생시킵니다.

나는 종종 rsync:link stat error디렉토리가 존재하지 않는다고 말하고 명령에 지정된 시간보다 짧은 대신 원격 서버 폴더의 모든 파일을 복사하게 됩니다 find. 간격 문제인지 또는 bash대괄호를 해석하는 방법이 확실하지 않습니다. 때로는 잘 작동하는 경우도 있습니다.

주문하다:

rsync --no-perms --ignore-existing -vt --files-from=<(ssh admin@rig700 'find /usr/bin/rig/cache -mmin -720 -type f -exec basename {} \;') admin@rig700:/usr/bin/rig/cache /usr/bin/rig/store

답변1

의 하위 디렉터리에 있는 경우에도 basename발견된 모든 파일을 명시적으로 호출합니다 . 이는 유사한 파일이 로 보고된다는 의미입니다 . 이 파일은 분명히 존재하지 않으므로 이에 대해 불만을 제기 하고 싶습니다 .find/usr/bin/rig/cache/usr/bin/rig/cache/subdir/myfilemyfile--files-from=rsync/usr/bin/rig/cachersync

당신이 할 수 있는 것은 with -print0대신에 사용하는 것입니다 .-exec basename {} \;find가득한\0(nul) 문자로 구분된 발견된 모든 파일의 경로입니다 . 그런 다음 --files-from=이 결과를 사용하여 --from0null로 구분된 경로 이름 목록임을 지정합니다.

rsync그런 다음 소스 경로로 사용하십시오 admin@rig700:.

그래서 저는 여기서 두 가지를 제안합니다.

  1. 보고서를 구분하는 데 사용되는 \0경로 이름 find(이것은오직경로 이름에 개행 문자가 허용되므로 Unix 시스템에서 경로 이름을 구분하는 데 사용하기에 안전한 문자입니다.
  2. 복사해야 하는 파일의 전체 경로 이름을 보고 find한 다음 이러한 경로를 있는 그대로 rsync.

마지막으로, 당신의 명령은

rsync -e 'ssh -q' --no-perms --ignore-existing -vt \
    --from0 --files-from=<(
        ssh -q admin@rig700 'find /usr/bin/rig/cache -mmin -720 -type f -print0'
    ) --no-relative  admin@rig700: /usr/bin/rig/store

--no-relative--no-R읽는 경로 이름이 --files-from절대 경로 이름으로 처리되도록 하려면 (or) 옵션이 필요합니다 . 이 옵션이 없으면 /usr/bin/rig/cache/somefile.txt경로 이름의 첫 번째 문자(예:)가 /제거되고 원격 호스트의 홈 디렉토리에 상대적이 됩니다.

또한 ( ) 옵션을 사용하여 원격 시스템에서 명령을 실행 ssh -q했습니다 . 내가 이걸 하는 이유는find-e--rshrsync원격 호스트가 환영 배너를 인쇄하는 것 같습니다.. 이 배너는 혼란스럽기 때문에 명령을 실행하든 를 rsync실행하든 인쇄를 비활성화해야 합니다 .findrsync

요약:

  1. basename발견된 파일을 실행하지 마십시오 find. 대신 원격 시스템에서 전체 경로를 가져 --no-relative와서 rsync.
  2. 원격 호스트의 환영 배너가 인쇄되지 않는지 확인하십시오.

관련 정보