rsync 디렉토리만 누락됨

rsync 디렉토리만 누락됨

rsync대상에서 누락된 소스 디렉터리(누락된 파일뿐만 아니라 전체 디렉터리)만 동기화 하도록 지시하는 방법이 있습니까 ?

S소스 디렉터리 집합과 대상 디렉터리 집합을 고려하여 D다음을 수행하고 싶습니다.

  • 그렇지 않은 경우 전체 디렉토리가 s여기에 복사됩니다.SsD
  • s.sD

물론 양쪽에 디렉터리를 나열하고, rsync대상에서 나열하고, 일부 작업을 수행 perl하고, 복사해야 하는 모든 디렉터리 목록을 생성하는 것이 가능하지만 단 한 번의 호출만 필요한 경우입니다 rsync.

예를 들어 소스와 대상이 동일한 서버에 있는 경우 다음을 수행할 수 있습니다.

src=/some/where
dst=/else/where
cd /tmp
(cd $src; find . -type d) | sort > a
(cd $dst; find . -type d) | sort > b
comm -23 a b | perl -e 'L: while(<>) {chomp; $p=$_; while ($p=~s,/[^/]+$,,) { next L if $n{$p}; } $n{$_}++; s,^./,/,; print "$_/***\n"}' > tocopy
rsync -vmazn --include-from tocopy --exclude '*' $src/ $dst/

( -n사실이라면 아니오).

추신: 위의 perl "한 줄"은 복사하기로 결정한 디렉토리의 하위 디렉토리를 삭제한다는 점에 유의하십시오(이 하위 디렉토리는 상위 디렉토리의 복사본에 포함되어 있기 때문입니다). 이 레시피는 복사할 가장 작은 디렉터리 집합으로 끝납니다.

답변1

당신이 원하는 것이 무엇이든, rsync만 사용하여 이를 수행하는 방법은 생각할 수 없습니다.

대상 측에 존재하는 디렉터리를 완전히 건너뛰려면 테스트가 재귀적이지 않으며 최상위 디렉터리만 중요합니다. 복사하려는 각 인수(in)에 대해 디렉터리가 대상 측에 존재하고 수행할 작업이 없거나, 소스 디렉터리가 존재하지 않고 전체를 복사하려고 합니다.dirNrsync --flag-that-you-hope-exists dir1 dir2 dir3 destination/

cd /path/to/source
for x in dir1 dir2 dir3; do
  [ -e "/path/to/target/$x" ] || cp -Rp -- "$x" /path/to/target/
done

실제로 대상 측에 존재하는 디렉터리로 재귀하고 디렉터리가 누락된 경우에만 파일을 복사하려는 경우 다음 방법을 사용하여 find소스 디렉터리를 반복하고 각 해당 대상 디렉터리를 확인할 수 있습니다.

cd /path/to/source
find . -type d -exec sh -c '
  if [ -e "$0/$1" ]; then exit 0; fi
  cp -Rp -- "$1" "$0/$1"
  exit 1
' /path/to/target {} \; -prune

소스 또는 대상이 원격인 경우 다음 명령을 사용하여 마운트하십시오.SSHFS.

답변2

거의 동일한 문제에 대한 해결책을 찾고 있지만 디렉토리의 첫 번째 수준만 확인하면 됩니다. 즉, srcDir이미 존재하는 디렉터리를 건너뛰기 위해 해당 디렉터리의 콘텐츠를 복사하고 싶습니다 dstDir(날짜, 크기 또는 콘텐츠를 확인하지 않고). 나는 이것을 할 방법이 전혀 없다는 것에 놀랐습니다. 그래서 나는 다음과 같은 해결책을 생각해 냈습니다.srcDirdstDirrsync

cd "$srcDir"
for f in *
do
    if [[ -d "$f" ]]
    then
        if [[ ! -d "$dstDir/$f" ]]
        then
            cp -a "$f" "$dstDir"
        fi
    fi
done
cd ..

관련 정보