다른 이름을 가진 Rsync 파일의 디렉터리

다른 이름을 가진 Rsync 파일의 디렉터리

rsync디렉터리에서 다음과 incoming같은 디렉터리로 파일을 복사 하려고 합니다 .outgoing

/testcopy/folder1/incoming/test1.txt

도착하다

/testdest/folder1/outgoing/

디렉토리 소스:

/testcopy/folder1/incoming/test1.txt
/testcopy/folder1/incoming/test2.txt
/testcopy/folder2/incoming/test1.txt
/testcopy/folder2/incoming/test2.txt
/testcopy/folder3/incoming/test1.txt
/testcopy/folder3/incoming/test2.txt

디렉터리 대상:

/testdest/folder1/outgoing/
/testdest/folder2/outgoing/
/testdest/folder3/outgoing/

내가 원하는 목적지는 다음과 같습니다.

/testdest/folder1/outgoing/test1.txt
/testdest/folder1/outgoing/test2.txt
/testdest/folder2/outgoing/test1.txt
/testdest/folder2/outgoing/test2.txt
/testdest/folder3/outgoing/test1.txt
/testdest/folder3/outgoing/test2.txt

내가 시도한 스크립트 rsync:

touch /testcopy/folder3/incoming/test4.txt

내가 볼 것으로 예상되는 것은 test4.txt다음 파일 입니다/testdest/folder3/outgoing/

# rsync -av /testcopy/*/incoming/* /testdest/*/outgoing/
sending incremental file list

sent 520 bytes  received 12 bytes  1,064.00 bytes/sec
total size is 0  speedup is 0.00

위 스크립트를 여러 번 반복해 보았지만 제대로 작동하지 않는 것 같습니다.

답변1

rsync원본과 대상 사이의 경로를 다시 쓰는 것은 허용되지 않습니다.

rsync당신이 할 수 있는 일은 /testcopy/*/incoming각 디렉토리에 대해 이것을 한 번씩 호출하는 것입니다:

for srcdir in /testcopy/*/incoming/; do
    [ ! -d "$srcdir" ] && break

    destdir=/testdest/${srcdir#/testcopy/}   # replace /testcopy/ with /testdest/
    destdir=${destdir%/incoming/}/outgoing/  # replace /incoming/ with /outgoing/

    mkdir -p "$destdir" &&
    rsync -av "$srcdir" "$destdir"
done

각 디렉터리에 대해 경로 접두사를 로 바꾸고 경로 접미사를 로 바꿔 대상 경로를 만듭니다 incoming. 이는 두 가지 표준 매개변수 대체를 사용하여 수행됩니다./testcopy//testdest//incoming//outgoing/

루프는 대상 디렉토리가 아직 존재하지 않는 경우 대상 디렉토리도 생성합니다.

[ ! -d "$srcdir" ] && break루프의 시작 부분은 패턴이 아무것도 일치하지 않으면 및가 mkdir실행 되지 않도록 보장합니다 rsync(기본적으로 쉘은 내부에 있지 않는 한 패턴을 확장되지 않은 상태로 둡니다 zsh). 에서는 루프 이전에 사용 bash하고 싶을 수도 있습니다 .shopt -s nullglob

관련 정보