rsync를 사용하여 특정 하위 디렉터리 집합을 복사하여 백업하려고 합니다. 내 디렉터리 구조는 다음과 같습니다.
/path/to/data/foo1
/path/to/data/foo2
/path/to/data/bar1
/path/to/data/bar2
"bar" 폴더는 무시하고 "foo" 폴더만 복사하고 싶습니다.
또한 이 폴더에 있는 모든 .zip 파일을 무시하고 싶습니다.
rsync에서 다양한 매개변수 조합을 시도했지만 원하는 방식으로 정확하게 작동하도록 할 수 없습니다.
전송을 수행하려면 두 가지 명령을 사용할 수 있습니다.
rsync --dry-run -a --human-readable --stats --progress --exclude"*.zip" "/path/to/data/foo1" "/mnt/backup/drive/"
rsync --dry-run -a --human-readable --stats --progress --exclude"*.zip" "/path/to/data/foo2" "/mnt/backup/drive"
다른 곳을 읽으면서 이런 일이 효과가 있기를 바랐습니다.
rsync --dry-run -a --human-readable --stats --progress --include="data/foo*" --exclude="*.zip" --exclude="*" "/path/to/data" "/mnt/backup/drive"
그러나 이것은 "bar" 폴더도 캡처하는 것 같습니다.
--include 및 --exclude 매개변수의 순서가 혼란스럽습니다. --include 매개변수에 "data" 폴더를 지정해야 하므로 이는 제가 기대했던 기능이 아닙니다.
내가 놓치고 있는 정말 숨길 수 없는 신호입니다!
귀하의 의견에 감사드립니다.
책
답변1
다음을 통해 rsync를 실행할 수 있습니다.
rsync --dry-run -av --human-readable --stats --progress --exclude="*.zip" /path/to/data/foo* /path/to/copy/to/
아마도 다음과 같이 명령을 단축하고 싶을 수도 있습니다.
rsync -avhn --stats --progress --exclude="*.zip" /path/to/data/foo* /path/to/copy/to/
에서 인용사람 동기화
-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose increase verbosity
-h, --human-readable output numbers in a human-readable format
-n, --dry-run perform a trial run with no changes made
명령을 실행할 준비가 되면 다음을 수행할 필요가 없습니다.-n
이 매개변수를 사용하여 로그 파일을 저장할 수도 있습니다.
--log-file=
따라서 위의 rsync 명령은 다음과 같습니다.
rsync -avhn --stats --progress --exclude="*.zip" --log-file=logfile.log /path/to/data/foo* /path/to/copy/to/
로그 파일은 명령이 실행된 디렉터리에 기록됩니다. 다른 곳에 저장해야 하는 경우 절대 경로를 사용해야 합니다. 예를 들어:
--log-file=/path/to/logfile
답변2
당신은 이미 적절한 대답을 가지고 있습니다. 좋습니다. 귀하의 질문 중 다른 부분을 해결하고 싶습니다. 이것이 바로 이 --include
기능이 귀하가 기대한 대로 작동하지 않는 이유입니다.
먼저 합계 필터가 --include
어떻게 작동하는지 살펴보겠습니다 .--exclude
aaa
명명된 모든 항목에 적용됩니다.aaa
/aaa
aaa
소스 경로 상단에 이름이 지정된 모든 파일 또는 디렉터리 에 적용됩니다.aaa/
명명된 모든 항목에 적용됩니다.aaa
경로가 디렉터리의 하위 디렉터리를 bbb/ccc/
나타내 도록 이를 결합할 수 있습니다.ccc
bbb
소스 트리의 어느 곳에서나, 그러나 디렉토리 내의 /bbb/ccc/
디렉토리 입니다.ccc
bbb
소스 트리의 상단에 바인딩.
포함 및 제외 작업은 왼쪽에서 오른쪽으로 처리됩니다(첫 번째 작업이 두 번째 작업보다 중요하고 두 번째 작업이 세 번째 작업보다 중요함).
이제 구체적인 예를 살펴보겠습니다.
rsync -ah --include="data/foo*" --exclude="*.zip" --exclude="*" "/path/to/data" "/mnt/backup/drive"
필터링 규칙은 다음 순서로 표시됩니다.
foo
이름이 다음으로 시작하는 이름의 디렉터리에 있는 모든 파일 또는 디렉터리를 포함합니다.data
소스 경로 아래 어딘가에.- 모든
*.zip
파일(또는 디렉터리)을 제외합니다. - 아직 언급하지 않은 모든 것을 제외하십시오.
첫 번째 포함은 일치 /path/to/data/data/foo1
하지만 일치하지 않습니다 /path/to/data/foo1
. 나는 이것이 중대한 오해라고 생각합니다.
/foo*
매우 유사한 솔루션으로 디렉터리를 일치시킬 수 있습니다 .
rsync -ah --include="/foo*/" --exclude="*.zip" --exclude="*" "/path/to/data/" "/mnt/backup/drive"
그러나 현실적으로 이 글을 쓰고 있다면 아마도 /foo*
소스 경로 사양에 디렉토리를 포함하고( foo*
쉘이 와일드카드를 선택할 수 있도록 따옴표로 묶지 않음) 불필요한 zip 파일을 제외하는 것에 대해 걱정할 것입니다.
rsync -ah --exclude="*.zip" /path/to/data/foo*/ /mnt/backup/drive
답변3
*
제외와 제외의 경우를 */
포함하려면 먼저 포함 data/foo
해야 합니다 data/
. 상위 디렉터리가 포함되지 않으면 하위 디렉터리도 무시됩니다.
매칭 패턴은 왼쪽에서 오른쪽으로 수행됩니다.