Rsync 디렉터리는 파일을 필터링하고 엣지 케이스(예: 하이픈(-) 이름)을 보존합니다.

Rsync 디렉터리는 파일을 필터링하고 엣지 케이스(예: 하이픈(-) 이름)을 보존합니다.

다음 구조의 테스트 폴더가 있습니다.

"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

이로 인해 오류가 발생하고 완료되지 않습니다.

rsync를 필터링하는 첫 번째 방법이 잘못되었습니다.

문제는 "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/

관련 정보