다음 명령이 있습니다.
rsync -r --exclude="node_modules" "/r2g_shared_dir/vamoot"/* "/home/node/.docker_r2g_cache/b640e7fd-27a7-4dd8-8ca8-5363a1c59c35"
방금 /*를 사용하면 도트 파일(.로 시작하는 파일/폴더)이 복사되지 않는다는 것을 깨달았습니다...
이 파일을 어떻게 포함할 수 있는지 아시는 분 계신가요?
내 생각에 가장 좋은 접근 방식은 /* 표기법을 버리고 그냥 사용하는 것입니다.
rsync -r --exclude="node_modules" "/r2g_shared_dir/vamoot" "/home/node/.docker_r2g_cache/b640e7fd-27a7-4dd8-8ca8-5363a1c59c35"
그런데 다른 방법이 있나요?
답변1
패턴 일치를 rsync에 남겨두는 것이 좋습니다. 그러면 해당 시점에 쉘에 있는 쉘과 옵션에 의존하지 않게 됩니다.
이 작업을 수행할 때:
rsync -a /some/dir/* host:/remote/dir/
/some/dir/*
그런 다음 실제로 rsync가 실제로 다음과 같이 실행되도록 해당 부분을 확장하도록 셸에 요청합니다 .
rsync -a /some/dir/adir /some/dir/afile /some/dir/anotherfile [etc] host:/remote/dir/
이는 종종 의도와 매우 유사하지만, 질문이 제시된 사실이 항상 그런 것은 아닙니다. 따라서 다음을 실행하는 것이 좋습니다.
rsync -a /some/dir/ host:/remote/dir/
이제 rsync는 (recursive의 약어이므로 -a
) 디렉터리를 재귀적으로 탐색하고 .-rlptgoD
-r
/some/dir
/remote/dir
/some/dir
소스 경로가 슬래시로 끝나기 때문에 /
전송된 파일 이름에서는 소스 위치의 모든 부분이 무시됩니다. /some/dir
통과 하면 dir
디렉터리가 명시적으로 동기화되도록 지시하는 것입니다.포함하다그것의 이름. 무슨 일이 일어나고 있는지 정말로 이해하지 않는 한 이러한 혼란을 피하기 위해 항상 마지막 슬래시를 추가하는 습관을 들이는 것이 좋습니다.
답변2
내 생각에 가장 좋은 방법은 아카이브 모드(-a)를 사용하는 것입니다. 매뉴얼 페이지에는 "이것은 -rlptgoD와 동일합니다. 이는 재귀적이고 거의 모든 것을 유지하고 싶다고 말하는 빠른 방법입니다(- H 중요한 누락이 있습니다):
rsync -a /source/path/ /destination/path/
- 항상 후행 슬래시 /를 사용하십시오.
- *는 도트 파일을 포함하지 않으므로 사용하지 마세요.
- 디스크 읽기/쓰기보다 느린 네트워크를 통해 전송하는 경우 압축 -z를 고려하세요.
답변3
이것이 bash라면 다음을 설정할 수 있습니다 dotglob
.
shopt -s dotglob
.
이는 일치하거나 일치하지 않습니다 ..
( 의 반대 .*
).
따라서 동일한 명령을 사용할 수 있습니다.
rsync -r --exclude="node_modules" "/r2g_shared_dir/vamoot"/* ...