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