rsync 대상에 폴더를 생성하지 않고 파일만 동기화

rsync 대상에 폴더를 생성하지 않고 파일만 동기화

rsync를 사용하여 대상에 디렉터리를 생성하지 않는 것이 가능합니까?

해당 소스가 있다고 상상해보십시오.

a/
a/x.txt
b/
b/y.txt

그리고 나는 다음 목적지를 가지고 있습니다.

a/
a/z.txt

원하는 결과는 다음과 같습니다 rsync source destination.

a/
a/x.txt
a/z.txt

물론 내 실제 상황에는 수천 개의 파일/폴더 구조가 포함되어 있으며 동기화된 폴더의 명시적인 목록과 관련된 솔루션을 원하지 않습니다.대상에 폴더 생성을 방지하는 깨끗한 방법을 찾고 있습니다.제외 또는 필터링... rsync가 이를 수행할 수 없는 경우 권한이 있는 해킹과 같이 rsync 외부의 것일 수도 있습니다...


참고로 이런 상황은 정말 쉽게 발생합니다. 제 경우에는 다음과 같습니다.

  • A2개의 디스크가 있는 서버를 &라고 가정해 보겠습니다 B. 그리고 로컬 드라이브 C.
  • 저는 보통 원격 & 로컬을 rsync동기화(및 병합)하는 데 사용합니다 .ABC
  • C그런 다음 때로는 일부 파일을 A및 에 다시 동기화하고 싶습니다 B. (새 파일만... 대상에 존재하지 않는 폴더가 아님)

답변1

다음을 시도해 보세요:

rsync -av src:/dir/to/files/* /dest/dir

중첩된 하위 디렉터리가 여러 개 있는 경우 먼저 다음과 같은 작업을 수행해야 합니다.

find /dir/to/files -type d -print

루프를 통해 해당 디렉터리 목록을 실행하고 매번 rsync를 호출하세요. 물론 원격 시스템에서 이 작업을 수행한다고 가정하면 ssh를 통해 찾기를 실행하고 결과를 배열에 저장한 다음 rsync 루프를 실행해야 합니다.

답변2

이제 rsync를 위해 이것을 구현하고 패치를 업스트림에 제출했습니다. https://lists.samba.org/archive/rsync/2015-November/030455.html

답변3

아마도 정상적인 rsync를 수행한 다음 두 번째 단계에서 새로 생성된 모든 폴더를 삭제하십시오. 위험할 것 같습니다.

이 작업의 안전성을 높이려면 대상 시스템의 사용자가 아닌 다른 사용자를 사용할 수 있습니다.

rsync $src $specialuser@server:$destination

해당 사용자가 원격으로 생성한 폴더 삭제:

ssh $normalUser@destination "find $destination -type d -user $specialuser -exec rm -r {} \;"

그런 다음 권한을 다시 일반으로 설정합니다.

ssh $normalUser@destination "chown -R $defaultUser:$defaultGroup $destination"

젠장, 이거 더러워 보이는데... 심각한 개선이 필요해요 :D

답변4

/*다음 결과의 각 줄에 a를 추가하는 스크립트를 사용하여 대상에 include_file 파일을 생성하는 것이 좋습니다 .

[target_dir] -type d >[target_dir]/include.file 찾기

그런 다음 rsync를 사용하여 --include_file=[target_dir]/include.file해당 파일의 패턴과 일치하는 파일만 포함하도록 지정할 수 있습니다. 이는 지정한 지점 아래 대상에 있는 전체 폴더 목록이어야 합니다.

매번 이 작업을 수행하는 스크립트를 생성하면 include.file의 목록이 항상 최신 상태가 됩니다. 그렇지 않으면 가끔씩 새로 고치기로 결정할 수도 있습니다(다시 rsync하려는 각 서버에 하나씩).

나중에 시간이 나면 여기에 사용 가능한 Python 스크립트를 게시하겠습니다. 하지만 이것이 앞으로 좋은 길을 열어줄 것입니다.

관련 정보