패턴 일치를 사용하는 rsync 특정 하위 디렉터리

패턴 일치를 사용하는 rsync 특정 하위 디렉터리

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
  • /aaaaaa소스 경로 상단에 이름이 지정된 모든 파일 또는 디렉터리 에 적용됩니다.
  • aaa/명명된 모든 항목에 적용됩니다.aaa

경로가 디렉터리의 하위 디렉터리를 bbb/ccc/나타내 도록 이를 결합할 수 있습니다.cccbbb 소스 트리의 어느 곳에서나, 그러나 디렉토리 내의 /bbb/ccc/디렉토리 입니다.cccbbb소스 트리의 상단에 바인딩.

포함 및 제외 작업은 왼쪽에서 오른쪽으로 처리됩니다(첫 번째 작업이 두 번째 작업보다 중요하고 두 번째 작업이 세 번째 작업보다 중요함).

이제 구체적인 예를 살펴보겠습니다.

rsync -ah --include="data/foo*" --exclude="*.zip" --exclude="*" "/path/to/data" "/mnt/backup/drive"

필터링 규칙은 다음 순서로 표시됩니다.

  1. foo이름이 다음으로 시작하는 이름의 디렉터리에 있는 모든 파일 또는 디렉터리를 포함합니다.data 소스 경로 아래 어딘가에.
  2. 모든 *.zip파일(또는 디렉터리)을 제외합니다.
  3. 아직 언급하지 않은 모든 것을 제외하십시오.

첫 번째 포함은 일치 /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/. 상위 디렉터리가 포함되지 않으면 하위 디렉터리도 무시됩니다.

매칭 패턴은 왼쪽에서 오른쪽으로 수행됩니다.

관련 정보