Upaya 1 (tidak berhasil)
Anda harus memasukkan direktori di samping file:
rsync -zavC --delete --include '*/' --include='*.php' --include='*.js' \
--exclude="*" /media/datacod/Test/ /home/lucas/Desktop/rsync/
Usaha ke-2
rsync -avzC --filter='-rs_*/.svn*' --include="*/" --include='*.js' \
--include='*.php' --exclude="*" --delete dir1/ dir2/
data uji
Saya menulis skrip ini untuk membuat beberapa sampel data untuk menguji ini. Berikut script yang, 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
Menjalankannya menghasilkan direktori berikut:
sumber dir
$ 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
tujuan dir
$ tree -a dir2
dir2
|-- dir1
| `-- .svn
| `-- keepdir
|-- dir2
| `-- .svn
| `-- keepdir
|-- dir3
| `-- .svn
| `-- keepdir
`-- dir4
`-- .svn
`-- keepdir
Menjalankan rsync
perintah di atas :
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
Menghasilkan dir2 afterards:
$ 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
Mengapa ini berhasil?
Bagian kunci dari skrip ini adalah untuk memanfaatkan kemampuan filter dari rsync
. Filter memungkinkan Anda untuk menghapus file dari set yang cocok di berbagai titik dalam perintah. Jadi dalam kasus kami, kami memfilter file apa pun yang cocok dengan polanya */.svn*
. Pengubah-rs_
memberi tahu filter bahwa kami ingin memfilter baik di sisi sumber maupun sisi target.
kutipan dari bagian CATATAN FILTER pada halaman manual rsync
Sebuah s digunakan untuk menunjukkan bahwa aturan tersebut berlaku untuk sisi pengirim. Ketika aturan mempengaruhi sisi pengiriman, itu mencegah file ditransfer. Defaultnya adalah aturan memengaruhi kedua sisi kecuali
--delete-excluded
ditentukan, dalam hal ini aturan default hanya menjadi sisi pengirim. Lihat juga aturan sembunyikan (H) dan tunjukkan (S), yang merupakan cara alternatif untuk menentukan sisi-pengiriman termasuk / tidak termasuk.
Sebuah r digunakan untuk menunjukkan bahwa aturan tersebut berlaku untuk sisi penerima. Ketika aturan mempengaruhi sisi penerima, itu mencegah file dari dihapus. Lihat pengubah s untuk info lebih lanjut. Lihat juga aturan proteksi (P) dan risiko (R), yang merupakan cara alternatif untuk menetapkan / mengecualikan sisi penerima.
Lihat man rsync untuk lebih jelasnya.
Kiat untuk mencari tahu ini (petunjuk menggunakan --dry-run
)
Sambil menjelaskan bagaimana melakukan ini, saya pikir saya akan menyebutkan --dry-run
beralih ke rsync
. Sangat berguna untuk melihat apa yang akan terjadi tanpa rsync
benar - benar terjadi.
Sebagai contoh
Menggunakan perintah berikut akan melakukan uji coba dan menunjukkan kepada kita logika keputusan di belakang 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)
Dalam output di atas Anda dapat melihat bahwa ./svn
direktori dilindungi oleh aturan filter kami. Wawasan berharga untuk debugging rsync
.
Referensi
include="*/"
memasukkannya.svn
, mengedit jawabannya. Lagi pula, setelah mengganti nama masalah tetap ada.-C
daninclude="*/"
sepertinya bukan teman yang sangat dekat :(Oke, setelah beberapa kali coba saya bereskan ini:
Terima kasih
sumber
.svn/
dir dari--prune-empty-dirs
dalam kasus mereka kosong. Pendekatan lain, yang ini menduplikasi direktori kosong:rsync -vaiz --delete --exclude=.svn/ --include='*.php' --include='*.js' --include='*/' --exclude='*' /origin /destination
--exclude=.svn/
sebelum--include
's-C
. Senang Anda menemukannya!Meskipun ini tidak menggunakan rsync, pilihan lain adalah menggunakan find dan cpio. Misalnya saya punya direktori bernama Foto dan itu tahun dan bulan.
Tapi di sini saya punya jpg, dng, xml dan hal-hal lain dan saya hanya ingin jpg jadi saya akan melakukan ini
"cd" ke direktori di atas direktori Photos lalu:
Dan pergilah
Anda dapat menggunakan metode ini untuk banyak hal, bertahun-tahun yang lalu ini adalah bagaimana kami akan menyalin / filesystem ketika pindah ke disk yang lebih besar karena akan menyalin file perangkat.
sumber