Bash 스크립트 및 rsync: 일부 폴더와 하위 폴더만 포함하는 방법 및 --delete와 함께 ../를 경로로 사용하면 어떻게 됩니까?

Bash 스크립트 및 rsync: 일부 폴더와 하위 폴더만 포함하는 방법 및 --delete와 함께 ../를 경로로 사용하면 어떻게 됩니까?

rsync를 사용하여 일부 폴더와 아카이브를 로컬로 복사하려는 bash 스크립트가 있습니다. 나는 다음과 같은 것을 가지고 있습니다 :

RootFolder
  A
  B
  C 
  D
     D1
     D2
     D3
     .
     .
     .
     DN 
  E 
  F

내가 원하는 것/하고 싶은 것:

  • 시작하기 전에 운명 폴더를 정리합니다. 옵션을 사용하여 이 작업을 수행합니다.--delete
  • 옵션을 사용하여 실행하는 특정 유형의 파일을 제외합니다 --exclude.
  • 옵션을 사용하여 실행하는 일부 폴더를 제외합니다 --exclude.

따라서 그 전에 폴더 A, B, D 및 E의 복사본이 있어야 합니다.

하지만 이제 D에서 일부 하위 폴더를 복사하면 목록이 목록에 따라 변경됩니다.

내가 원하는 것을 상상해 보세요:

 A 
 B 
 D 
   D2 
   D4
   D8
 E 

--include시도했지만 잘못했기 때문에 어떻게 해야 할지 모르겠습니다 .

나는 비슷한 일을하고 있습니다 :

 rsync -av --delete --include=/D/D2 --include=/D/D4 --include=D8 --exclude=/C --exclude=/F RootFolder/ DestinyFolder

그런데 잘 안되네요... 반복을 좀 해볼 생각을 했는데요, 아니면 이 모든 것을 변수로 감싸서 rsync에 전달할 수 있을지 모르겠습니다.

또 다른 질문이 있습니다. 매개변수를 통해 대상 폴더를 가져올 때 사용자가 "../"를 사용하고 --delete 옵션이 있으면 어떻게 되나요? 현재 폴더가 삭제되나요? 사용자가 "/"만 쓰면 모든 것이 삭제되나요?

편집하다: 가지다:

RootFolder
  A
     File.txt
     .HidenFile
  B
  C 
  D
     D1
     D2
       File.txt
       .HidenFile
     D3
     .
     .
     .
     DN 
  E 
  F

나는 다음과 같은 것을 가지고 있습니다

rsync -av --delete  --include=/D/D2 --include=/D/D4 --include=D8 --exclude=*.txt  --exclude=.* --exclude=/C --exclude=/F RootFolder/ DestinyFolder

답변1

--include및에 대한 옵션은 --exclude왼쪽에서 오른쪽으로 적용됩니다. 첫 번째 옵션은 항상 가장 강력하므로 목록을 종료하여 --exclude='*/'추가 디렉터리 처리를 중지할 수 있습니다.

그러나 일단 사용하면 --exclude='*/'모든 파일과 디렉터리의 암시적 처리가 비활성화되며 포함할 파일과 폴더를 명시적으로 지정해야 합니다.

  • A, 및를 포함하려고 합니다 B.E모든 파일과 폴더,
  • D디렉토리가 아닌 파일이기를 원합니다 .
  • 당신이 원하는 D/D2, D/D4, /D/D8그리고모든 파일과 폴더,
  • 다른 사람은 없습니다.

따라서 다음과 같은 include/exclude 문을 구성할 수 있습니다.

rsync --dry-run -av --delete

    --include '/A' --include '/A/**'
    --include '/B' --include '/B/**'
    --include '/E' --include '/E/**'

    --include '/D'

    --include '/D/D2' --include '/D/D2/**'
    --include '/D/D4' --include '/D/D4/**'
    --include '/D/D8' --include '/D/D8/**'

    -exclude '*/'

    src/ dst/

bash배열을 처리할 수 있는 셸을 사용하고 있으므로 --include명령어 세트를 안전하게 구축할 수 있습니다. 예는 다음과 같습니다.

# It's an array
includes=()

# Start with the fixed set of known directories
for known in A B E
do
    includes+=('--include' "/$known" '--include' "/$known/**")
done

# Special case
includes+=('--include' '/D')

# Now the changeable set of subdirectories. You might get this list elsewhere
for subdirs in D2 D4 D8
do
    includes+=('--include' "/D/$subdir" '--include' "/D/$subdir/**")
done

# Put it all together
rsync --dry-run -av "${includes[@]}" --exclude '*/' src/ dst/

관련 정보