당신은 이동 :
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 파일에 저장하면 사용할 수있는 편리한 유틸리티가 있어야합니다.
더 명확하게하기 위해 질문이 업데이트되었습니다. 귀하의 솔루션은 현재 디렉토리에 대한 테스트 폴더의 상대적인 특성 때문에 만 작동한다고 생각합니다. '/ User//test/*'라고 말하면, 전체 폴더 구조를'output' 내에 복제 할 수 있습니다. –
ThaDon
괜찮습니다. rsync가이 모든 것을 할 수 있다고 생각하지 않습니다. 다른 유닉스 명령어를 함께 파이프 할 필요가있다. 나는 다시 대답 – 75inchpianist
일하고 기록을 위해, 나는 완전한 절대 경로를 시도하지 않았고 여전히 효과가 있었다. 위의 수정 사항을 참조하십시오. – 75inchpianist