
다음과 같은 소스 디렉터리가 있습니다(src 및 bin 디렉터리 내부에 수많은 하위 디렉터리 포함).
- top_dir
- 프로젝트1
- 소스/
- 큰 상자/
- 스크립트/
- somefile.txt
- 프로젝트2
- 소스/
- 큰 상자/
- 표적
- 큰 상자/
- 파일.xml
- 프로젝트1
프로젝트 디렉토리 바로 아래의 bin 디렉토리(즉, top_dir/proj2/target/bin/ 무시)와 그 내용을 대상 디렉토리에 rsync하여 다음과 같이 만들고 싶습니다.
- top_dir
- 프로젝트1
- 큰 상자
- 프로젝트2
- 큰 상자
- 프로젝트1
include-from 파일에 각 bin 디렉토리(실제 시나리오에서는 약 15개 있음)를 명시적으로 나열하여 작동하게 할 수도 있지만 모든 top_dir/을 동기화하고 싶다고 말할 수 있는 방법이 있어야 한다고 생각했습니다. */bin 디렉토리.
답변1
가능성 1
의 필터 규칙 대신 셸 확장 1을 사용하면 다음과 같이 할 수 있습니다.rsync
ㅏ. 계층 구조 bin
에 모든 디렉토리를 포함하려면 다음 을 수행 top_dir
하십시오.
rsync -av -R top_dir/**/bin/ destination_path
다음은 -R
rsync 2 매개변수입니다.상대적인. man rsync
그것을 다음과 같이 설명한다
상대 경로를 사용하십시오. 이는 파일 이름의 마지막 부분이 아닌 명령줄에 지정된 전체 경로 이름이 서버로 전송된다는 의미입니다. 이는 여러 개의 서로 다른 디렉터리를 동시에 보내려는 경우 특히 유용합니다.
그러나 본질적으로 이는 디렉토리 구조가 보존된다는 것을 의미합니다.
**
은 쉘 글로빙 패턴이며 bin
아래에 이름이 지정된 디렉토리를 반복적으로 검색합니다 top_dir
. 따라서 위의 예에서는 명령줄이 다음과 같이 확장됩니다.
rsync -av -R top_dir/proj1/bin/ top_dir/proj2/bin/ destination_path
비. bin
프로젝트 디렉토리보다 한 수준 아래에 디렉토리 만 포함하려면 단일 디렉토리만 사용하세요 *
("고대" 쉘에서도 작동합니다!).
rsync -av -R top_dir/*/bin/ destination_path
1 최근 정보가 필요합니다.세게 때리다버전(>4)을 통해 재귀적 글로빙을 활성화합니다 shopts -s globstar
. 와 함께zsh재귀적 글로빙이 기본값입니다.
2 rsync 버전 v3.2.3 Linux의 프로토콜 버전 31.
가능성 2
필요한 rsync의 필터 규칙만 사용하면 됩니다.
ㅏ. 계층 구조 bin
에 모든 디렉토리를 포함하려면 다음 을 수행 top_dir
하십시오.
rsync -av -m --include='**/' --include='**/bin/**' --exclude='*' top_dir/ destination_path
첫 번째 include
규칙은 명확하지 않을 수 있지만 3 모든 디렉터리(후행 참고 /
)가 검색되도록 보장하고, 두 번째 규칙은 bin
디렉터리 의 모든 항목을 추가하며 exclude
규칙은 다른 모든 항목을 제외합니다. -m
빈 디렉토리가 복사되지 않았는지 확인하십시오.
비. 프로젝트 디렉토리 아래에 한 레벨만 포함하려면 다음을 수행하십시오.
rsync -av -m --include='/*/' --include='/*/bin/***' --exclude='*' top_dir/ destination_path
***
rsync >= 구문 사용 2.6.7. /
패턴의 선두는 를 나타내고 top_dir
, 그렇지 않으면 패턴이 일치됩니다.끝파일 경로의.
3/some/path/this-file-will-not-be-found
에서 검색하세요man rsync
답변2
다음을 사용하여 모든 src
디렉터리를 제외할 수 있습니다.--exclude src/