일부 파일을 rsync하고, 나머지는 제외하고, .svn/ 디렉토리를 재귀적으로 무시합니다.

일부 파일을 rsync하고, 나머지는 제외하고, .svn/ 디렉토리를 재귀적으로 무시합니다.

rsync공유의 일부 파일을 다른 공유로 복사하는 데 사용합니다 .

재귀적으로 다음이 필요합니다.

  • 원본 위치에서 삭제된 대상 위치의 파일 삭제
  • 동기화 .php.js파일 만
  • 다른 모든 파일 형식 제외
  • .svn/대상 디렉토리를 삭제하지 마십시오

내가 이것을 사용하는 경우 :

rsync -zavC --delete --include='*.php' --include='*.js' --exclude="*" \
    /origin /destination

모든 파일과 폴더가 제외되므로 재귀 rsync적이지 않습니다 .exclude="*"

추가하면 --include="*/"디렉토리 .svn/가 제거됩니다(또한 포함됩니다).

이 가슴 아픈 딜레마를 어떻게 해결할 수 있습니까?

uname -a:

Linux tux 3.9.2-1-ARCH #1 SMP PREEMPT 5월 11일 토요일 20:31:08 CEST 2013 x86_64 GNU/Linux

rsync버전:

rsync 3.0.9-6

답변1

첫 번째 시도(실패)

파일 외에도 다음 디렉터리도 포함해야 합니다.

rsync -zavC --delete --include '*/' --include='*.php' --include='*.js' \
     --exclude="*" /media/datacod/Test/ /home/lucas/Desktop/rsync/

두 번째 시도

rsync -avzC --filter='-rs_*/.svn*' --include="*/" --include='*.js' \
     --include='*.php' --exclude="*" --delete dir1/ dir2/

테스트 데이터

이를 테스트하기 위해 몇 가지 샘플 데이터를 생성하기 위해 이 스크립트를 작성했습니다. 스크립트는 다음과 같습니다 setup_svn_sample.bash.

#!/bin/bash

# setup .svn dirs
mkdir -p dir{1,2}/dir{1,2,3,4}/.svn

# fake data under .svn
mkdir -p dir1/dir{1,2,3,4}/.svn/origdir
mkdir -p dir2/dir{1,2,3,4}/.svn/keepdir

# files to not sync
touch dir1/dir{1,2,3,4}/file{1,2}

# files to sync
touch dir1/dir{1,2,3,4}/file1.js
touch dir1/dir{1,2,3,4}/file1.php

이를 실행하면 다음 디렉터리가 생성됩니다.

소스 디렉토리

$ tree -a dir1
dir1
|-- dir1
|   |-- file1
|   |-- file1.js
|   |-- file1.php
|   |-- file2
|   `-- .svn
|       `-- origdir
|-- dir2
|   |-- file1
|   |-- file1.js
|   |-- file1.php
|   |-- file2
|   `-- .svn
|       `-- origdir
|-- dir3
|   |-- file1
|   |-- file1.js
|   |-- file1.php
|   |-- file2
|   `-- .svn
|       `-- origdir
`-- dir4
    |-- file1
    |-- file1.js
    |-- file1.php
    |-- file2
    `-- .svn
        `-- origdir

대상 디렉토리

$ tree -a dir2
dir2
|-- dir1
|   `-- .svn
|       `-- keepdir
|-- dir2
|   `-- .svn
|       `-- keepdir
|-- dir3
|   `-- .svn
|       `-- keepdir
`-- dir4
    `-- .svn
        `-- keepdir

rsync명령을 실행합니다.

rsync -avzC --filter='-rs_*/.svn*' --include="*/" --include='*.js' \
     --include='*.php' --exclude="*" --delete dir1/ dir2/
sending incremental file list
dir1/file1.js
dir1/file1.php
dir2/file1.js
dir2/file1.php
dir3/file1.js
dir3/file1.php
dir4/file1.js
dir4/file1.php

sent 480 bytes  received 168 bytes  1296.00 bytes/sec
total size is 0  speedup is 0.00

이후에 생성된 dir2:

$ tree -a dir2
dir2
|-- dir1
|   |-- file1.js
|   |-- file1.php
|   `-- .svn
|       `-- keepdir
|-- dir2
|   |-- file1.js
|   |-- file1.php
|   `-- .svn
|       `-- keepdir
|-- dir3
|   |-- file1.js
|   |-- file1.php
|   `-- .svn
|       `-- keepdir
`-- dir4
    |-- file1.js
    |-- file1.php
    `-- .svn
        `-- keepdir

왜 작동합니까?

스크립트의 핵심 부분은 rsync.filters를 활용하여 명령의 다양한 지점에서 일치 세트에서 파일을 제거할 수 있도록 하는 것입니다. 따라서 우리의 경우에는 패턴과 일치하는 모든 파일을 필터링합니다 */.svn*. 수정자는 -rs_소스 측과 대상 측 모두에서 필터링하고 싶다고 필터에 알려줍니다.

rsync 매뉴얼 페이지의 FILTER NOTES 섹션에서

  • 하나에스규칙이 보낸 사람에게 적용됨을 나타내는 데 사용됩니다. 규칙이 보낸 사람에게 영향을 미치면 파일 전송이 차단됩니다. 기본 규칙은 지정되지 않는 한 두 당사자 모두에게 영향을 미치며 --delete-excluded, 이 경우 기본 규칙은 발신자에게만 적용됩니다. 보낸 사람 포함/제외를 지정하는 또 다른 방법인 숨기기(H) 및 표시(S) 규칙도 참조하세요.

  • 하나아르 자형 규칙이 수신자에게 적용됨을 나타내는 데 사용됩니다. 규칙이 수신자에게 영향을 미치면 파일이 삭제되지 않습니다. 자세한 내용은 s 수정자를 참조하세요. 수신자 포함/제외를 지정하는 또 다른 방법인 보호(P) 및 위험(R) 규칙도 참조하세요.

바라보다사람 동기화자세한 내용은.

이 문제를 해결하는 팁(사용 팁 --dry-run)

이를 수행하는 방법을 설명할 때 --dry-runSwitch to 에 대해 언급해야 한다고 생각했습니다. 이는 실제로 발생 rsync하지 않고 어떤 일이 일어날지 아는 데 매우 유용합니다 .rsync

예를 들어

다음 명령을 사용하면 테스트 실행이 수행되고 그 뒤에 있는 의사 결정 논리가 표시됩니다 rsync.

rsync --dry-run -avvzC --filter='-rs_*/.svn*' --include="*/" \
     --include='*.js' --include='*.php' --exclude="*" --delete dir1/ dir2/
sending incremental file list
[sender] showing directory dir3 because of pattern */
[sender] showing directory dir2 because of pattern */
[sender] showing directory dir4 because of pattern */
[sender] showing directory dir1 because of pattern */
[sender] hiding file dir1/file1 because of pattern *
[sender] showing file dir1/file1.js because of pattern *.js
[sender] hiding file dir1/file2 because of pattern *
[sender] showing file dir1/file1.php because of pattern *.php
[sender] hiding directory dir1/.svn because of pattern */.svn*
[sender] hiding file dir2/file1 because of pattern *
[sender] showing file dir2/file1.js because of pattern *.js
[sender] hiding file dir2/file2 because of pattern *
[sender] showing file dir2/file1.php because of pattern *.php
[sender] hiding directory dir2/.svn because of pattern */.svn*
[sender] hiding file dir3/file1 because of pattern *
[sender] showing file dir3/file1.js because of pattern *.js
[sender] hiding file dir3/file2 because of pattern *
[sender] showing file dir3/file1.php because of pattern *.php
[sender] hiding directory dir3/.svn because of pattern */.svn*
[sender] hiding file dir4/file1 because of pattern *
[sender] showing file dir4/file1.js because of pattern *.js
[sender] hiding file dir4/file2 because of pattern *
[sender] showing file dir4/file1.php because of pattern *.php
[sender] hiding directory dir4/.svn because of pattern */.svn*
delta-transmission disabled for local transfer or --whole-file
[generator] risking directory dir3 because of pattern */
[generator] risking directory dir2 because of pattern */
[generator] risking directory dir4 because of pattern */
[generator] risking directory dir1 because of pattern */
[generator] protecting directory dir1/.svn because of pattern */.svn*
dir1/file1.js
dir1/file1.php
[generator] protecting directory dir2/.svn because of pattern */.svn*
dir2/file1.js
dir2/file1.php
[generator] protecting directory dir3/.svn because of pattern */.svn*
dir3/file1.js
dir3/file1.php
[generator] protecting directory dir4/.svn because of pattern */.svn*
dir4/file1.js
dir4/file1.php
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 231 bytes  received 55 bytes  572.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

위 출력에서 ./svn​​디렉터리가 필터링 규칙에 의해 보호되고 있음을 알 수 있습니다. 디버깅용 rsync.

인용하다

답변2

좋습니다. 여러 번 시도한 끝에 문제를 해결했습니다.

rsync -vaiz --delete --exclude=.svn/ --include='*.php' --include='*.js' \
    --include='*/' --exclude='*' --prune-empty-dirs \
    --filter "protect .svn/" /origin /destination

감사해요

답변3

rsync를 사용하지 않지만 또 다른 옵션은 find 및 cpio를 사용하는 것입니다. 예를 들어 연도와 월이 함께 표시된 "Photos"라는 디렉토리가 있습니다.

Photos
├── 2002
│   ├── 2002-03
│   │   ├── 2002-03-30
│   │   ├── 2002-03-31
│   │   └── 2002-03-31-02
│   ├── 2002-04
│   │   ├── 2002-04-01
│   │   ├── 2002-04-01-03
│   │   ├── 2002-04-07
│   │   ├── 2002-04-21
│   │   ├── 2002-04-22
│   │   ├── 2002-04-22-02
│   │   └── 2002-04-27
│   ├── 2002-05
│   │   ├── 2002-05-02
│   │   ├── 2002-05-03

하지만 여기에는 jpg, dng, xml 및 기타 파일이 있고 jpg만 필요하므로 이렇게 하겠습니다.

Photos 디렉토리 위의 디렉토리로 "cd"한 후 다음을 수행하십시오.

find Photos -type f -name "*jpg" -print | cpio -pdmvu /fast

그러다가 사라졌어

/fast/Photos/2002/2002-04/2002-04-22/bath problem.jpg
/fast/Photos/2002/2002-04/2002-04-22-02/full bath.jpg
/fast/Photos/2002/2002-07/2002-07-10/Broken Top.jpg
/fast/Photos/2002/2002-12/2002-12-28/101-0125_IM~~G.jpg
/fast/Photos/2002/2002-12/2002-12-28/small-101-0125_IM~~G.jpg
/fast/Photos/2003/2003-01/2003-01-19/k1.jpg
/fast/Photos/2003/2003-01/2003-01-19/k2.jpg
/fast/Photos/2003/2003-02/2003-02-23/quinn.jpg
/fast/Photos/2003/2003-05/2003-05-04/all.jpg
/fast/Photos/2003/2003-05/2003-05-09/100_0015_r1.jpg
/fast/Photos/2003/2003-05/2003-05-09/100_0006_2_r1.jpg
/fast/Photos/2003/2003-05/2003-05-09/100_0006_r1.jpg
/fast/Photos/2003/2003-05/2003-05-09/100_0007_2_r1.jpg

이 접근 방식은 많은 용도로 사용할 수 있습니다. 몇 년 전에는 장치 파일을 복사했기 때문에 더 큰 디스크로 이동할 때 / 파일 시스템을 복사하는 방법이었습니다.

관련 정보