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/