특정 유형 및 날짜의 간단한 파일 전송을 수행하기 위해 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
*.xq
rsync
--dry-run
rsync --dry-run -av --include '**/' --include '*.xq' --exclude '*' admin@host:/results/analysis/ /home/serverdir/
--include
합의 혼합은 --exclude
다음과 같이 왼쪽에서 오른쪽으로 설명됩니다.
--include '**/'
모든 디렉터리 포함(파일 제외)--include '*.xq'
glob과 일치하는 모든 파일(또는 디렉터리)을 포함합니다.*.xq
--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
명령이 로컬이 아닌 원격 호스트에서 실행된다는 것입니다.