rsync, geri kalanlar hariç, belirli dosyaları .svn / dizinini görmezden gelerek


19

rsyncBazı dosyaları paylaşımdan diğerine kopyalamak için kullanıyorum .

Özyineli olarak şunları yapmam gerekir:

  • Varış yerindeki başlangıç ​​noktasından kaldırılan dosyaları sil
  • Yalnızca senkronizasyon .phpve .jsdosyalar
  • Diğer tüm dosya türlerini hariç tut
  • Hedefteki .svn/dizinleri silmeyin

Bunu kullanırsam:

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

Daha sonra rsyncözyinelemeli değildir, çünkü exclude="*"tüm dosyaları değil, klasörleri de hariç tutar.

Eklersem --include="*/", .svn/dizin silinir (ayrıca dahil edilir).

Bu zihin patlatma ikilemini nasıl çözebilirim?

uname -a:

Linux tux 3.9.2-1-ARCH # 1 SMP PREEMPT Cts 11 Mayıs 20:31:08 CEST 2013 x86_64 GNU / Linux

rsync versiyon:

rsync 3.0.9-6

Yanıtlar:


13

1. deneme (işe yaramadı)

Dosyalara ek olarak dizinleri de eklemeniz gerekir:

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

2. deneme

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

test verisi

Bunu test etmek için bazı örnek veriler oluşturmak için bu komut dosyasını yazdım. İşte bu senaryo 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

Çalıştırılması aşağıdaki dizinleri üretir:

kaynak 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

hedef yön

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

Yukarıdaki rsynckomutu çalıştırmak :

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

Sonuç 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

Neden çalışıyor?

Bu komut dosyasının en önemli parçası filtreleri kullanabilmektir rsync. Filtreler, komutun çeşitli noktalarındaki eşleşen kümeden dosyaları kaldırmanıza olanak tanır. Yani bizim durumumuzda, kalıba uyan tüm dosyaları filtreliyoruz */.svn*. Değiştiriciler -rs_filtreye hem kaynak hem de hedef tarafta filtrelemek istediğimizi söyler.

rsync kılavuz sayfasının FİLTRE NOTLARI bölümünden alıntı

  • Bir s kural gönderen tarafta uygulanacağını belirtmek için kullanılır. Bir kural gönderen tarafı etkilediğinde dosyaların aktarılmasını önler. Varsayılan, bir kuralın --delete-excludedbelirtilmediği sürece her iki tarafı da etkilemesidir , bu durumda varsayılan kurallar yalnızca gönderen tarafı olur. Ayrıca, gönderme tarafı dahil etme / hariç tutma özelliklerini belirtmenin alternatif bir yolu olan gizle (H) ve göster (S) kurallarına da bakın.

  • Bir R kuralı, alıcı taraf için de geçerli olduğunu belirtmek için kullanılır. Bir kural alıcı tarafı etkilediğinde dosyaların silinmesini önler. Daha fazla bilgi için s değiştiricisine bakın. Ayrıca, alıcı tarafı dahil etme / hariç tutma özelliklerini belirtmenin alternatif bir yolu olan koruma (P) ve risk (R) kurallarına da bakın.

Daha fazla bilgi için man rsync'e bakınız.

Bunu anlamaya yönelik ipuçları (ipucu kullanma --dry-run)

Bunun nasıl tanımlamakla birlikte ben belirtmekte fayda var --dry-runanahtarı rsync. Gerçekte gerçekleşmeden ne olacağını görmede son derece kullanışlıdır rsync.

Örneğin

Aşağıdaki komutu kullanmak bir test çalıştırması yapar ve bize arkasındaki karar mantığını gösterir 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)

Yukarıdaki çıktıda ./svndizinlerin filtre kuralımız tarafından korunduğunu görebilirsiniz . Hata ayıklama için değerli bilgiler rsync.

Referanslar


Yukarıda da söylediğim gibi bunu zaten denedim. Bunu yaparsam, o zaman .SVN dizini de dahil edilir (büyük olasılıkla silinir, çünkü kökeni yok veya değiştirilmiş). .SVN dizinine dokunulmaması önemlidir. Yine de denemek için teşekkürler! :)
canolucas

-C'nin ".SVN /" yoksayması gerekiyor, ancak include="*/"bunu içeriyor
canolucas

Haklısın. Olmalı.svnCevabı düzenlemek . Her neyse, yeniden adlandırdıktan sonra sorun devam ediyor. -Cve include="*/"çok yakın arkadaş gibi görünmüyor :(
canolucas

10

Tamam, birkaç denemeden sonra bunu sıraladım:

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

teşekkür ederim


Mükemmel cevap. .svn/Filtrem --prune-empty-dirsboş olması durumunda kirleri korur . Başka bir yaklaşım, bu boş dizinleri rsync -vaiz --delete --exclude=.svn/ --include='*.php' --include='*.js' --include='*/' --exclude='*' /origin /destination
çoğaltıyor

Yaklaşımımın anahtarı --exclude=.svn/, --include's
canolucas

İyi cevap. Bir exclude = '. Svn /' önerirdim ama kullanmak istediğini sanıyordum -C. Bunu çözmene sevindim!
slm

0

Bu rsync kullanmasa da başka bir seçenek find ve cpio kullanmaktır. Mesela Photos adlı bir dizinim var, o yıl ve ay.

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

Ama burada jpg, dng, xml ve diğer şeyler var ve sadece jpg istiyorum bu yüzden bunu yapmak istiyorum

Fotoğraflar dizininin üzerindeki dizine "cd" yazın:

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

Ve kapalı gidiyor

/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

Bu yöntemi birçok şey için kullanabilirsiniz, yıllar önce, daha büyük disklere taşınırken / dosya sistemini cihaz dosyalarını kopyaladığı gibi kopyalayacağız.


Bu soruya cevap vermiyor.
RalfFriedl

Kullanıyorsa yapar: find / origin -type f (-name " .php" -o -name " .js") -print | cpio -pdmvu / destination Hedef dizinde yalnızca * .php ve * .js dosyaları bulunur.
lxtwin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.