Rsync는 암시적으로 제외된 파일을 "찾습니다"

Rsync는 암시적으로 제외된 파일을 "찾습니다"

특정 유형 및 날짜의 간단한 파일 전송을 수행하기 위해 Linux 시스템의 명령과 결합하는 반작업 rsync명령이 있습니다 .find

이것은 명령입니다:

rsync -avx --timeout=30 --ignore-existing admin@host:'`find /results/analysis/ -mtime -1 -type f -iname  "*.xq"`' /home/serverdir/

문제는 이것이다:

파일이 발견되면 위 명령이 완벽하게 실행됩니다. 파일을 찾을 수 없으면 중단되고 어떤 이유로 실제로 원격 시스템의 홈 디렉토리에 있는 파일을 보냅니다. 그런데 이는 -mtime으로 표시된 1일보다 훨씬 오래되었습니다.

에러 메시지:

receiving incremental file list
./
rsync: send_files failed to open "/home/admin/.viminfo": Permission denied (13)
file.txt

명령이 아무것도 보고하지 않는 것과 같습니다 find. rsync는 기본적으로 홈 디렉터리의 모든 것을 전송합니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

답변1

복사하려는 것은 파일뿐이므로 find및를 혼합하는 대신 직접 수행할 수 있습니다. 변경 사항에 영향을 주지 않고 안전하게 테스트할 수 있도록 이 플래그를 포함시켰습니다. 준비가 되면 명령줄에서 제거하세요.rsync*.xqrsync--dry-run

rsync --dry-run -av --include '**/' --include '*.xq' --exclude '*' admin@host:/results/analysis/ /home/serverdir/

--include합의 혼합은 --exclude다음과 같이 왼쪽에서 오른쪽으로 설명됩니다.

  1. --include '**/'모든 디렉터리 포함(파일 제외)
  2. --include '*.xq'glob과 일치하는 모든 파일(또는 디렉터리)을 포함합니다.*.xq
  3. --exclude '*'언급되지 않은 항목 제외

답변2

여러분이 관찰한 것은 정확히 무슨 일이 일어나고 있는지입니다. HOST:명시적인 경로 없이 전체 기본 디렉터리(일반적으로 홈 디렉터리)를 복사하라는 요청을 받습니다.

Note  also  that  host  and  module references don’t require a trailing
slash to copy the contents of the default directory.  For example, both
of these copy the remote directory’s contents into "/dest":

       rsync -av host: /dest
       rsync -av host::module /dest

가능하다면 완전히 피하거나 find(rsync는 전송된 파일에 대해 무시할 만한 대역폭을 사용한다는 점을 기억하세요) 두 단계로 수행하는 것이 좋습니다(먼저 find, 그 다음 rsync출력에서).

보다 정확하게는 다음과 같은 작업이 작동합니다(간결성을 위해 일부 rsync 옵션을 생략했습니다).

ssh user@host find source-dir -mtime -1 -type f -printf %p\\\\0 \
| rsync --from0 --files-from=- user@host:. dest-dir/

귀하의 의견에서 언급한 주요 변경 사항은 find명령이 로컬이 아닌 원격 호스트에서 실행된다는 것입니다.

관련 정보