2012-03-31 7 views
32

rsync 구문을 올바르게 가져 오는 데 문제가 있으며 실제 시나리오를 rsync로 실제로 처리 할 수 ​​있는지 궁금합니다. 첫째, rsync가 로컬 호스트와 원격 호스트간에 잘 작동하는지 확인했습니다. 디렉토리에서 직선 동기화를 수행하면 성공한 것입니다.Rsync include 및 exclude 옵션을 사용하여 디렉토리 및 파일을 패턴으로 포함합니다.

여기처럼 내 파일 시스템이 어떻게 표시되는지를 보여줍니다 : 내가 뭘 원하는 것은 실행 rsync를 만 하위 디렉토리에서 "file_11_"로 시작하는 파일에

uploads/ 
    1260000000/ 
    file_11_00.jpg 
    file_11_01.jpg 
    file_12_00.jpg 
    1270000000/ 
    file_11_00.jpg 
    file_11_01.jpg 
    file_12_00.jpg 
    1280000000/ 
    file_11_00.jpg 
    file_11_01.jpg 
    file_12_00.jpg 

난 그냥 하나의 rsync를 작업을 실행할 수 있도록하려면 하위 디렉토리에있는 모든 파일을 동기화합니다.

rsync -nrv --include="**/file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

이 결과 0 파일 내 드라이 런의 전송에 표시되는 :

는 여기에 내가 노력하고있어 명령입니다. 나는 --include와 --exclude 문과 같은 다른 여러 조합을 시도했지만 아무런 결과도 얻지 못했거나 include 또는 exclude 옵션을 설정하지 않은 것처럼 모든 것을 얻었습니다.

누구나 어떻게해야할까요?

답변

67

문제는 --exclude="*" 그렇게 rsync 결코 그 디렉토리의 내용을 검사하지 않기 때문에 결코 디렉토리가 --include 일치했을 파일이 포함되어 있음을 통지, (예를 들어)를 1260000000/ 디렉토리를 제외 말한다는 것이다.

내가 당신이 원하는 것을 가장 가까운 것은이 생각 :

rsync -nrv --include="*/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

, 아니면 이 (모든 디렉토리 및 file_11*.jpg 일치하는 모든 파일,하지만 다른 파일을 포함한다) :

rsync -nrv --include="/[0-9][0-9][0-9]0000000/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

(동일한 개념 만이 포함됩니다 디렉토리에 대해 많이 까다로워).

+1

감사! 그것은 내가 필요로했던 바로 그 것이었다. 내 시나리오는 실제로 두 번째 예제에서 설명한 것과 비슷했지만 문제를보다 직관적으로 만들기 위해 내 질문을 단순화했습니다. –

+0

@SheldonChang : 천만에! – ruakh

+5

실제로 포함시키고 자하는 파일의 ** parent ** 디렉토리를 포함 할 때 (예)'--include = "* /"'의 중요성에 유의하십시오. – mabraham

7

공백 디렉토리를 제거하려면 위의 권장 답변에 -m을 추가하십시오.

2

rsync 패턴의 예를 제외 포함

"*"   means everything 
"dir1"  transfers empty directory [dir1] 
"dir*"  transfers empty directories like: "dir1", "dir2", "dir3", etc... 
"file*"  transfers files whose names start with [file] 
"dir**"  transfers every path that starts with [dir] like "dir1/file.txt", "dir2/bar/ffaa.html", etc... 
"dir***" same as above 
"dir1/*" does nothing 
"dir1/**" does nothing 
"dir1/***" transfers [dir1] directory and all its contents like "dir1/file.txt", "dir1/fooo.sh", "dir1/fold/baar.py", etc... 

그리고 마지막 노트는 단순히 경로를 평가하기위한 시작에 사용되는 별표에 의존 해달라고이다; "**dir" (ok는 단일 폴더 나 파일에는 사용할 수 있지만 경로는 사용할 수 없음)과 같이 파일 이름에 두 개 이상의 별표가 작동하지 않습니다.

+0

당신의 대답은 당신이 일반적인 행동을 설명하기 때문에 사용할 수있는 유일한 답입니다. 다른 답변은 영업 이익에 따라 너무 구체적이지만 각 상황마다 다른 해결책이 필요합니다! 그것은 나를 많이 도왔다! –

+0

@AlBundy 임 기쁘게! – TechJS