rsync
대상에서 누락된 소스 디렉터리(누락된 파일뿐만 아니라 전체 디렉터리)만 동기화 하도록 지시하는 방법이 있습니까 ?
S
소스 디렉터리 집합과 대상 디렉터리 집합을 고려하여 D
다음을 수행하고 싶습니다.
- 그렇지 않은 경우 전체 디렉토리가
s
여기에 복사됩니다.S
s
D
s
.s
D
물론 양쪽에 디렉터리를 나열하고, 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)에 대해 디렉터리가 대상 측에 존재하고 수행할 작업이 없거나, 소스 디렉터리가 존재하지 않고 전체를 복사하려고 합니다.dirN
rsync --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
(날짜, 크기 또는 콘텐츠를 확인하지 않고). 나는 이것을 할 방법이 전혀 없다는 것에 놀랐습니다. 그래서 나는 다음과 같은 해결책을 생각해 냈습니다.srcDir
dstDir
rsync
cd "$srcDir"
for f in *
do
if [[ -d "$f" ]]
then
if [[ ! -d "$dstDir/$f" ]]
then
cp -a "$f" "$dstDir"
fi
fi
done
cd ..