다음 구조의 테스트 폴더가 있습니다.
"driveA"
- "bar - foo"
- "fileBarFooA"
- "fileBarFooB"
- "fileA"
- "fileB"
- "fileC"
- "folder.A"
- "fileAA"
- "fileAB"
- "folderB"
- "fileBA"
- "fileBB"
Bash 셸에서 A 드라이브의 내용을 B 드라이브("folder.A" 폴더 제외)에 동기화하여 다음과 같은 결과 복사본을 얻으려고 합니다.
"driveB"
- "bar - foo"
- "fileBarFooA"
- "fileBarFooB"
- "fileA"
- "fileB"
- "fileC"
- "folderB"
- "fileBA"
- "fileBB"
언뜻 보면 이를 달성하는 한 가지 방법은 필터링된 ls를 DriveA의 rsync에 대한 인수로 제공하는 것입니다.
rsync -aR -- `ls -F | grep [^folder.A/]` ../driveB
이로 인해 오류가 발생하고 완료되지 않습니다.
문제는 "bar - foo" 폴더가 복사되지 않는다는 점입니다. 오류를 살펴보면 한 가지 문제는 ls -F
파일 이름과 폴더의 이스케이프되지 않은 출력을 제공한다는 것입니다.
:driveA$ ls -F
bar - foo/
fileA
fileB
fileC
folder.A/
folderB/
이스케이프 문자를 출력하는 옵션을 찾지 못했으므로 ls
다음으로 시도할 것은 후처리입니다. sed
한 가지 방법은 이스케이프 문자를 추가하는 것입니다.
:driveA vgani$ ls -F | sed 's/\ /\\\ /g' | grep [^folder.A/]
bar\ -\ foo/
fileA
fileB
fileC
folderB/
이와 병행하여 다음과 같이 주어진다:
:driveA $ rsync -aR `ls -F | sed 's/\ /\\\ /g' | grep [^folder.A/]` ../driveB
rsync: -\: unknown option
rsync error: syntax or usage error (code 1) at /BuildRoot/Library/Caches/com.apple.xbs/Sources/rsync/rsync-51/rsync/main.c(1337) [client=2.6.9]
-\
아, 버그입니다(그리고 1337 버그도 있습니다!) 이는 rsync가 폴더의 일부를 명령줄 인수로 사용하기 때문이므로 다음을 추가하여 해결할 수 있습니다 --
.
driveA $ rsync -aR -- `ls -F | sed 's/\ /\\\ /g' | grep [^folder.A/]` ../driveB
따라서 이스케이프 문자를 추가하지 않고도 결과와 동일하게 보입니다.
또 다른 후처리 아이디어는 따옴표를 추가하는 것입니다.
:driveA $ ls -F | sed 's/^/"/g' | sed 's/[^/]$/"/g' | sed 's/\//"\//g'
"bar - foo"/
"file"
"file"
"file"
"folder.A"/
"folderB"/
그러나 이로 인해 rsync는 따옴표를 리터럴 문자로 처리하고 아무것도 복사하지 않게 됩니다.
:driveA $ rsync -aR -- `ls -F | sed 's/^/"/g' | sed 's/[^/]$/"/g' | sed 's/\//"\//g' | grep [^\"folder.A\"/]` ../driveB
rsync: link_stat "/driveA/"bar" failed: No such file or directory (2)
rsync: link_stat "/driveA/-" failed: No such file or directory (2)
rsync: link_stat "/driveA/foo"/" failed: No such file or directory (2)
rsync: link_stat "/driveA/"file"" failed: No such file or directory (2)
rsync: link_stat "/driveA/"file"" failed: No such file or directory (2)
rsync: link_stat "/driveA/"file"" failed: No such file or directory (2)
rsync: link_stat "/driveA/"folderB"/" failed: No such file or directory (2)
rsync error: some files could not be transferred (code 23) at /BuildRoot/Library/Caches/com.apple.xbs/Sources/rsync/rsync-51/rsync/main.c(996) [sender=2.6.9]
지금까지 혼란스럽습니다. 하이픈 문자로 인해 질식되지 않고 콘텐츠를 제공할 수 있는 방법이 있습니까 rsync
?ls
답변1
Rsync에는 exclude
옵션이 있습니다. 다음을 통해 이를 달성할 수 있어야 합니다.
cd /path/to/driveA
rsync -avWxP --exclude=folder.A . /path/to/driveB/