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
답변
첫 번째 시도 (작동하지 않음)
파일 외에도 디렉토리를 포함해야합니다.
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
. 필터를 사용하면 명령의 다양한 지점에서 일치하는 세트에서 파일을 제거 할 수 있습니다. 우리의 경우 패턴과 일치하는 파일을 필터링합니다 */.svn*
. 수정자는 -rs_
소스 측과 대상 측 모두에서 필터링하려는 필터를 알려줍니다.
rsync 매뉴얼 페이지의 FILTER NOTES 섹션에서 발췌
들 규칙이 송신 측에 적용된다는 것을 나타 내기 위해 사용된다. 규칙이 송신 측에 영향을 주면 파일이 전송되지 않습니다. 기본값은 규칙
--delete-excluded
이 지정 되지 않은 경우 양쪽에 영향을 미치며
,이 경우 기본 규칙은 발신자 측만됩니다. 송신 측 포함 / 제외를 지정하는 대체 방법 인 숨기기 (H) 및 표시 (S) 규칙도 참조하십시오.R은 규칙이 수신 측에 적용되는 것을 나타 내기 위해 사용된다. 규칙이 수신 측에 영향을 주면 파일이 삭제되지 않습니다. 자세한 정보는 s 수정자를 참조하십시오. 수신자 측 포함 / 제외를 지정하는 대체 방법 인 보호 (P) 및 위험 (R) 규칙도 참조하십시오.
자세한 내용은 man rsync 를 참조하십시오.
이것을 알아내는 요령 (를 사용하는 힌트 --dry-run
)
이 작업을 수행하는 방법을 설명하는 동안 --dry-run
스위치를 언급한다고 생각 했습니다 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
.
참고 문헌
답변
좋아, 여러 번 시도한 후에 이것을 정리했습니다.
rsync -vaiz --delete --exclude=.svn/ --include='*.php' --include='*.js' \
--include='*/' --exclude='*' --prune-empty-dirs \
--filter "protect .svn/" /origin /destination
감사합니다
답변
이것은 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
몇 년 전에이 방법을 여러 가지 용도로 사용할 수 있습니다. 장치 파일을 복사 할 때와 같이 더 큰 디스크로 이동할 때 / 파일 시스템을 복사하는 방법입니다.