2013-12-13 1 views
9

나는 다음과 같은 구조를 가지고 :하나의 파일을 동기화하고 유지 N 수준

/Users 
    /build 
    /.jenkins 
     /jobs 
     /Job1 
      config.xml 
      someotherfiles.blah 
     /Job2 
      config.xml 
      someotherfiles.blah 
     /JobN 
      config.xml 
      someotherfiles.blah 

나는 백업에 새 폴더에 같은 폴더 구조를 유지 다른 폴더 만 config.xml 파일을 원하는을 하지만 /User/build/.jenkins/jobs

을 멀리 치기

내 새 폴더는 다음과 같이 보일 것이다 :

backup/ 
    /Job1 
    config.xml 
    /Job2 
    config.xml 
    /JobN 
    config.xml 

이것이 가능 rsync를 사용 할까?

편집 : 실수 출력에서 ​​someotherfiles.blah을 포함했다, 나는 실제로 그 싶지 않아요. 필자가 원하는 것은 config.xml 파일과 폴더 구조를 1 단계 위로 올려 놓는 것뿐입니다. 여기

답변

1

당신은 이동 :

find ./build/.jenkins/jobs/* | 
grep -i 'someotherfiles.blah' | 
cut -d/-f 5- | 
rsync -v -r --exclude-from=- ./build/.jenkins/jobs/ ./output 

단계에서는 이런 일이 무엇인가 :

find ./build/.jenkins/jobs/* 

이 지정된 경로에있는 디렉토리/파일의 목록을 제공합니다. 그것의 출력은

./build/.jenkins/jobs/Job1 
./build/.jenkins/jobs/Job1/config.xml 
./build/.jenkins/jobs/Job1/someotherfiles.blah 
./build/.jenkins/jobs/Job2 
./build/.jenkins/jobs/Job2/config.xml 
./build/.jenkins/jobs/Job2/someotherfiles.blah 
./build/.jenkins/jobs/Job3 
./build/.jenkins/jobs/Job3/config.xml 
./build/.jenkins/jobs/Job3/someotherfiles.blah 

입니다. 그런 다음 grep 명령으로 파이프하여 필터 할 패턴을 넣을 수 있습니다. 내 예에서, 내가 someotherfiles.blah

find ./build/.jenkins/jobs/* | 
grep -i 'someotherfiles.blah' 

출력을 제외 grepping하고하는 것은

./build/.jenkins/jobs/Job1/someotherfiles.blah 
./build/.jenkins/jobs/Job2/someotherfiles.blah 
./build/.jenkins/jobs/Job3/someotherfiles.blah 

이제 rsync를가 동기화에서 제외 할 패턴 목록을 stdin에서 걸릴 것입니다. 그러나 src 인수에 상대적인 경로가 있어야하므로 out 목록에서 처음 몇 개의 디렉토리를 잘라냅니다.

find ./build/.jenkins/jobs/* | 
grep -i 'someotherfiles.blah' | 
cut -d/-f 5- 

출력 : 그것은 --exclude-에서 = 사용 rsync는 그것을에

Job1/someotherfiles.blah 
Job2/someotherfiles.blah 
Job3/someotherfiles.blah 

이제 파이프 - 인수를. 그러면 stdin에서 파일을 제외하도록 지시합니다.

find ./build/.jenkins/jobs/* | 
grep -i 'someotherfiles.blah' | 
cut -d/-f 5- | 
rsync -v -r --exclude-from=- ./build/.jenkins/jobs/ ./output 

이 솔루션은 rsync를에서 제외 할 파일의 목록을 찾을 GREP을 사용

building file list ... done 
Job1/ 
Job1/config.xml 
Job2/ 
Job2/config.xml 
Job3/ 
Job3/config.xml 

sent 318 bytes received 104 bytes 844.00 bytes/sec 
total size is 15 speedup is 0.04 

출력. grep 표현식이 특정 파일 만 독점적으로 포함되도록 할 수 있습니다. --include-from = - 인수를 사용하여이 작업을 수행 할 수도 있습니다. 또한 한 가지 더 많은 변경 사항이 있습니다. 다음은이에 대한 전체 코드 만 복사 config.xml의 파일

find ./build/.jenkins/jobs/ | 
grep -i 'config.xml' | 
cut -d/-f 5- | 
awk -F/ '{print; while(/\//) {sub("/[^/]*", ""); print}}'| 
rsync -v -r --include-from=- --exclude='*' ./build/.jenkins/jobs/ ./output 

당신이 --exclude 목록에 물건을 추가 할 때, rsync를 목록의 하위 디렉토리를 검색하지 않습니다이다. 우리는 Job1,2,3 폴더에 config.xml 파일을 가지고 있으므로 분명히 원하지 않습니다! 따라서 awk을 사용하여 config.xml 파일을 검색 할 상위 디렉토리를 출력에 추가합니다.

는 그 후, 우리는 우리의 표준 입력에서---include와 ('*')를 사용하여 상대 경로 위의

경로를 다른 모든 것을 배제 할 rsync를 말해 당신이 절대 경로를 사용하는 경우, 필요에 따라 경로를 수정하고 cut 명령의 -f 인수가 잘라낼 오른쪽 토큰 번호를 선택했는지 확인하십시오.

어쨌든 이러한 명령을 .sh 파일에 저장하면 사용할 수있는 편리한 유틸리티가 있어야합니다.

+0

더 명확하게하기 위해 질문이 업데이트되었습니다. 귀하의 솔루션은 현재 디렉토리에 대한 테스트 폴더의 상대적인 특성 때문에 만 작동한다고 생각합니다. '/ User//test/*'라고 말하면, 전체 폴더 구조를'output' 내에 복제 할 수 있습니다. – ThaDon

+0

괜찮습니다. rsync가이 모든 것을 할 수 있다고 생각하지 않습니다. 다른 유닉스 명령어를 함께 파이프 할 필요가있다. 나는 다시 대답 – 75inchpianist

+0

일하고 기록을 위해, 나는 완전한 절대 경로를 시도하지 않았고 여전히 효과가 있었다. 위의 수정 사항을 참조하십시오. – 75inchpianist

3

이 작동합니다 : 당신은 rsync를에 -R 옵션을 통과하지 않는

rsync -r --include=Job* --include=config.xml --exclude=* /full/path/to/Users/build/.jenkins/ backup 

전체 경로

백업 디렉토리에 복사되지 않습니다. Job*config.xml을 포함하고 *을 제외하면 (포함 또는 제외 규칙에 처음 맞는 것이 복사 내용을 결정하므로 순서가 중요합니다.) 결국 원하는 구조로 끝납니다.

하나의 솔루션은 하나의 규칙을 사용하여 포함하는 계층 구조에있는 모든 디렉토리를 요청하는 것입니다 명시 적 Job* 패턴을 갖는 것은 너무 제한적인 경우, 수동 당신이 */ 패턴을 사용할 수 있어야합니다 말한다 : "+ * /"("- *"규칙 앞에 넣으십시오)

자세한 내용은 설명서 페이지의 전체 포함/제외 패턴 규칙 섹션을 참조하십시오.

+1

필터 규칙 구문에서 이것은'+ config.xml''+ * /''- *'('--filter'를 사용하여 적용) –

1

--relative 옵션으로 시작할 폴더 수준을 지정할 수 있습니다. 수동에서

:

그것은 당신이 지정한 각 경로에 대한 묵시적 디렉토리로 전송되는 경로 정보의 양을 제한 할 수있다. 송신 측 (2.6.7로 시작)에 현대 rsync와 함께, 당신은 점과 소스 경로에 슬래시,이 같은 삽입 할 수 있습니다 :이 예에서

rsync -avR /foo/./bar/baz.c remote:/tmp/ 

을의 --relative 옵션이 시작됩니다 두 번째 수준에서 폴더를 만들 수 있습니다. 리모컨에서 :

/tmp 
|_ bar 
    |_ baz.c 
+0

시도했습니다. 이것이 가장 효과적인 방법입니다. 왜 아무도 투표하지 않는지 궁금합니다. 운이 좋은 나는 첫 번째입니다. 굉장히 유용하다. 고맙습니다! – fanchyna

관련 문제