İki klasörü komut satırı araçlarıyla nasıl senkronize edebilirim?


63

Windows’tan Linux’a geçtikten sonra Winmerge’e alternatif bir yazılım bulmak veya Linux’taki iki klasörü karşılaştırmak ve senkronize etmek için komut satırı araçlarını öğrenmek istiyorum. Komut satırında aşağıdaki görevleri nasıl yapacağımı söylerseniz minnettar olurum ... (diff ve rsync okudum, ama hala biraz yardıma ihtiyacım var.)

İki klasörümüz var: "/ home / user / A" ve "/ home / user / B"

Klasör A, normal dosya ve klasörlerin kaydedildiği ve B klasörü, A klasörünün tam bir aynası olarak işlev gören bir yedekleme klasörüdür (B klasörü içindeki kullanıcı tarafından hiçbir şey doğrudan kaydedilmez veya değiştirilmez).

Benim sorularım:

  • Sadece B klasöründe bulunan dosyalar nasıl listelenir? (Örneğin, son senkronizasyondan bu yana A klasöründen silinenler.)

  • Yalnızca B klasöründe bulunan dosyalar A klasörüne nasıl kopyalanır?

  • Her iki klasörde bulunan ancak farklı zaman damgaları veya boyutları olan dosyalar nasıl listelenir? (Son senkronizasyondan bu yana A klasöründe değiştirilmiş olanlar. Onbinlerce dosya olduğundan ve işlemi çok yavaşlattığı için sağlama toplamlarını kullanmaktan kaçınmak istiyorum.)

  • A klasörünün tam bir kopyasını B klasöründe nasıl yapabilirim? Yani, A klasöründeki her şeyi yalnızca A klasöründe bulunan B klasörüne kopyalayın ve B klasöründeki her şeyi yalnızca B klasöründe bulunan ancak her iki klasörde aynı olan dosyalara dokunmadan silin.


Neden bunun için uygun bir yedekleme programı kullanmıyorsunuz? Kopyalık bir örnektir.
Qudit

Yanıtlar:


88

Bu, A klasörünü B klasörüne yerleştirir:

rsync -avu --delete "/home/user/A" "/home/user/B"  

A ve B klasörlerinin içeriğinin aynı olmasını istiyorsanız, /home/user/A/(eğik çizgiyle birlikte) kaynak olarak koyun . Bu, A klasörünü değil, içeriğini alır ve B klasörüne yerleştirir.

rsync -avu --delete "/home/user/A/" "/home/user/B"
  • -a Tüm dosya sistemi niteliklerini koruyarak senkronizasyon yapın
  • -v ayrıntılı olarak koşmak
  • -u yalnızca daha yeni bir değişiklik zamanına sahip dosyaları kopyala (veya zamanlar eşitse boyut farkı)
  • --delete Kaynakta bulunmayan hedef klasördeki dosyaları sil

Manpage: https://download.samba.org/pub/rsync/rsync.html


7
rsync : rsync uygulamasını çalıştırın, -a : tüm dosya sistemi özelliklerini koruyarak eşitlemeyi yapın, -v : ayrıntılı olarak çalıştırın, -z : eşitleme sırasında verileri sıkıştırın (verileri sıkıştırılmış modda taşıyın ), --delete : dosyaları hedefdeki silin kaynağında, bulunmayan klasör / home / kullanıcı / A kaynak klasör,: / home / kullanıcı / B hedef klasörü:
SonicARG

Merhaba SonicARG, Buna geri dönmeyi ve açıklamayı koymayı tamamen unuttum, açıklamayı gönderdiğiniz için teşekkürler, sizinkini cevabın içine koydum, umarım sakıncası yok.
TuxForLife

6
Rsync öncelikli olarak farklı bilgisayarlar arasında dosya kopyalamak içindir, burada açıklandığı gibi dizinleri de eşitleme amacına hizmet edebilir. Bu nedenle -z seçeneği, ağ trafiğini azaltmak ve böylece 2 bilgisayar arasında bir rsync'in performansını artırmak için ilginçtir: (diskten veri oku -> sıkıştır) === network ===> (sıkıştırmayı aç -> diske yaz) Kullanma - Alacağınız (-> kompres -> sıkıştırmayı - diske> yazma diskten veri okumak) gibi aynı ana bilgisayarda 2 dizinleri senkronize etmek z biraz saçma ve cpu döngüleri kaybıdır
GerritCap

@GerritCap, bir düzenleme yaptım, değerli girişiniz için teşekkürler
TuxForLife

1
Komutu denedim, ancak /home/user/B/AA'nın içeriğinin üzerine B içeriğinin üzerine yazmak yerine bir alt-dizin oluşturuyor . Şuna bir bakmama yardım eder misin?
Luke

10

unisonU Penn'de Benjamin Pierce tarafından geliştirilen bir araç olabilir .

İki dizinin olduğunu varsayalım.

/home/user/Documents/dirA/ ve /home/user/Documents/dirB/

Bu ikisini senkronize etmek için şunları kullanabilirsiniz:

~ $unison -ui text /home/user/Documents/dirA/ /home/user/Documents/dirB/

Çıktıda, eşitlemek istediğiniz iki dizinde farklı olan unisonher bir dizini ve dosyayı görüntüler . Bu additively senkronize ilk kaçak (her iki konumda da dosya eksik çoğaltmak), sonra oluşturmak ve makinede bir senkronizasyon ağacı korumak ve bir dosya silerseniz sonraki koşular üzerine o, yani gerçek senkronizasyonu (uygulayacak için tavsiye eder , onu de silinir de. Ayrıca her değişimi karşılaştırmak ve isteğe bağlı olarak tercih edebilirsiniz iletmek veya ters iki dizin arasında senkronize edin..../dirA.../dirB

İsteğe bağlı olarak, grafik arayüzü başlatmak için -ui textseçeneği komutunuzdan kaldırın , ancak clikullanımı daha basit ve daha hızlı buluyorum .

Bu konuda daha fazla: Unison kullanıcı dokümantasyonunda Unison eğitimi .


1

TuxForLife'ın cevabı oldukça iyi, ama -cyerel olarak senkronize ederken kullanmanızı şiddetle tavsiye ediyorum . Uzaktan senkronizasyonlarda bunu yapmak için zaman / ağ cezasına değmeyeceğini, ancak hızın çok büyük olması nedeniyle tamamen yerel dosyalar için buna değer olduğunu iddia edebilirsiniz.

-c, --checksum
       This forces the sender to checksum every regular file using a 128-bit  MD4
       checksum.   It  does this during the initial file-system scan as it builds
       the list of all available files. The receiver then checksums  its  version
       of  each  file  (if  it exists and it has the same size as its sender-side
       counterpart) in order to decide which files need to be updated: files with
       either  a  changed  size  or a changed checksum are selected for transfer.
       Since this whole-file checksumming of all files on both sides of the  con-
       nection  occurs  in  addition to the automatic checksum verifications that
       occur during a file's transfer, this option can be quite slow.

       Note that rsync always verifies that each transferred file  was  correctly
       reconstructed  on  the receiving side by checking its whole-file checksum,
       but that automatic after-the-transfer verification has nothing to do  with
       this  option's  before-the-transfer  "Does  this file need to be updated?"
       check.

Bu, aynı boyutta ve zaman damgasına sahip olmanın nasıl başarısız olabileceğini gösterir.

Kurulum

$ cd /tmp

$ mkdir -p {A,b}/1/2/{3,4}

$ echo "\___________from A" | \
      tee A/1/2/x  | tee A/1/2/3/y  | tee A/1/2/4/z  | \
  tr A b | \
      tee b/1/2/x  | tee b/1/2/3/y  | tee b/1/2/4/z  | \
      tee b/1/2/x0 | tee b/1/2/3/y0 >     b/1/2/4/z0

$ find A b -type f | xargs -I% sh -c "echo %; cat %;"
A/1/2/3/y
\___________from A
A/1/2/4/z
\___________from A
A/1/2/x
\___________from A
b/1/2/3/y
\___________from b
b/1/2/3/y0
\___________from b
b/1/2/4/z
\___________from b
b/1/2/4/z0
\___________from b
b/1/2/x
\___________from b
b/1/2/x0
\___________from b

Dosyaların tümü aynı boyutta ve zaman damgası içerdiğinden hiçbir şeyi kopyalayamayan rsync

$ rsync -avu A/ b
building file list ... done

sent 138 bytes  received 20 bytes  316.00 bytes/sec
total size is 57  speedup is 0.36

$ find A b -type f | xargs -I% sh -c "echo %; cat %;"
A/1/2/3/y
\___________from A
A/1/2/4/z
\___________from A
A/1/2/x
\___________from A
b/1/2/3/y
\___________from b
b/1/2/3/y0
\___________from b
b/1/2/4/z
\___________from b
b/1/2/4/z0
\___________from b
b/1/2/x
\___________from b
b/1/2/x0
\___________from b    

Doğru çalışan, çünkü sağlama toplamlarını karşılaştırdığı için rsync

$ rsync -cavu A/ b
building file list ... done
1/2/x
1/2/3/y
1/2/4/z

sent 381 bytes  received 86 bytes  934.00 bytes/sec
total size is 57  speedup is 0.12

$ find A b -type f | xargs -I% sh -c "echo %; cat %;"
A/1/2/3/y
\___________from A
A/1/2/4/z
\___________from A
A/1/2/x
\___________from A
b/1/2/3/y
\___________from A
b/1/2/3/y0
\___________from b
b/1/2/4/z
\___________from A
b/1/2/4/z0
\___________from b
b/1/2/x
\___________from A
b/1/2/x0
\___________from b

-c ve -u birlikte iyi çalışıyor mu?
Sergey Korzhov

@ SereyKorzhov yapar. `-U 'hala sadece hedef yeni değilse güncelleme yapmak için her zamanki gibi çalışır.
Bruno Bronosky,

1

Bu, kişisel dosyaları yedeklemek için kullandığım, kapsanan her şeyi umursamadığım -ave daha yararlı bilgiler yazdırmak istediğim şey.

rsync -rtu --delete --info=del,name,stats2 "/home/<user>/<src>/" "/run/media/<user>/<drive>/<dst>"

Gönderen rsync man sayfasında :

-r, --recursive
Bu, rsync'e dizinleri yinelemeli olarak kopyalamasını söyler.

-t, --times
Bu, rsync'e dosyalarla birlikte değişiklik zamanlarını aktarmasını ve uzaktaki sistemde güncellemesini söyler.

-u, --update
Bu , rsync'i hedefte var olan dosyaları atlamaya ve kaynak dosyadan daha yeni bir değiştirilmiş zamana sahip olmaya zorlar. (Mevcut bir hedef dosya, kaynak dosyaya eşit bir zamana sahipse, boyutlar farklıysa güncellenecektir.)

--delete
Bu, rsync'e harici dosyaları alıcı taraftan (gönderen tarafta olmayanlar) silmesini, ancak yalnızca senkronize edilen dizinler için bildirmesini sağlar.

--info = BAYRAKLAR
Bu seçenek, görmek istediğiniz bilgi çıktısı üzerinde hassas kontrol sahibi olmanızı sağlar.

itibaren rsync --info=help

DEL        Mention deletions on the receiving side  
NAME       Mention 1) updated file/dir names, 2) unchanged names  
STATS      Mention statistics at end of run (levels 1-3)

Daha az açık olsa da, bu görünüşte eşdeğer ve daha kısadır:

rsync -rtuv --delete --info=stats2 "/home/<user>/<src>/" "/run/media/<user>/<drive>/<dst>"

-v, --verbose
Tek bir -v size hangi dosyaların aktarıldığı hakkında bilgi verir ve sonunda kısa bir özet verir [istatistik1].


0

Bu tamamen sizin istediklerinizle aynı değil, ancak bir sürüm kontrol aracı kullanmayı düşünebilirsiniz. Git gibi araçlar, istediğiniz her şeyi yapar ve daha fazlasını, özellikle de doğrudan B klasöründe çalışmazsanız, ona bakmak ilginç olabilir. git hakkında daha fazla bilgiyi burada bulabilirsiniz.


2
Bu sadece sürüm kontrolüne her şeyi eklemek istediğinizde işe yarar. Aynı zamanda, kalıcı olabilecek şekilde depolanması gereken ve her zaman istenmeyen olabilecek her değişikliği zorlar.
Qudit

@ Qudit, bu doğrudur, ancak geçmişi sınırlamak için klonlama yoluyla mümkün olsa da, ancak geçmişi sınırlamak Git'te varsayılan olarak uygulanmadı.
switch87

@ switch87 Evet, eski taahhütleri silebileceğinizi biliyorum. Sürüm kontrolü, özellikle büyük ikili dosyalar varsa, gerçi genel yedekleme işlemleri için gerçekten uygun bir çözüm değildir.
15:15

Sorusu yerel yedekleme içindir, ancak uzaktan yedekleme için kullanırsanız daha büyük dosyalar için git ekini kullanabilirsiniz. Yerel yedekleme için bu bir problem değildir.
switch87

2
@ switch87 Bu gerçekten Q için bir yorum olmalı ve git için nasıl yedekleme yapacağınızı açıklamadığı için bir cevap olmamalıydı.
slm

0

Bu şekilde kullanabilirsiniz:

rsync -avu --delete /home/user/A/* /home/user/B/

Bu şekilde, A klasörünün içeriğini, A klasörünün içeriğini değil, B klasörüne kopyalarsınız.

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.