Dosyalara kopyalamak yerine yama dosyası oluşturmak için rsync alın?


19

Ben rsync kullanarak bir sunucudan diğerine değişti birçok dosya kopyalıyorum. -nKuru bir çalışma yapmak için seçeneği kullanabileceğimi biliyorum , böylece hangi dosyaların değiştirildiğini görebiliyorum. Ancak rsync'in değişen dosya içeriğinin bir çıktısını alması mümkün mü? Bir kopya yapmadan önce neler olduğunu görmek ister misiniz? Bir şey bir dosyaya kaydedebilirsiniz ve diff (1) ile sonra uygulamak?

Yanıtlar:


8

Daha iyi bir yol olabilir, ancak bu verimli olmasa da işe yarayabilir:

 rsync -vrn / dest:/ > ~/file_list

Ardından istatistikleri kaldırmak için testi düzenleyin ve ardından:

while read file; do
    diff $file <(ssh dest "cat $file")
done < ~/edited_file_list

Başka Bir Seçenek:
Dosya sistemini sshfs / fuse gibi bir şeye monte etmeyi ve sonra sadece diff'i kullanmayı düşünebilirsiniz.


Not: Bu komutları test etmedim ;-)
Kyle Brandt

İyi bir başlangıç, ancak rsync'den istatistikler ve "artımlı dosya listesi gönderme" vb. Gibi ek çıktılar var
Rory

--Out-format = "% f" kullanabilirsiniz
Kyle Brandt

Out formatını kullanırsanız, v'yi bırakın ve grep -v 'normal olmayan dosyayı atlıyor' ... Bu oldukça temiz olmalı
Kyle Brandt

Şans eseri rsync --diffiki yıl sonra yeni / daha iyi bir yöntem olup olmadığını kontrol edin ...
Yüzük Ø



1

Doğal olarak mümkün değildir, çünkü rsync sadece dosyalar arasındaki ikili farkları önemsiyor.

Rsync'in çıktısını kullanarak komut dosyasını yazabilirsiniz. Ama acayip olurdu.

Yine de Unison ile yerel olarak mümkün olduğuna inanıyorum .


1
Benimki kibirle ne demek istiyorsun? :-)
Kyle Brandt

Kesinlikle, Kyle: D
Dan Carley

1

Neden sadece farkları oluşturmak için diff (metin dosyaları için) veya xdelta (ikili dosyalar için) gibi bir şey kullanmıyorsunuz? Neden özellikle rsync'den bir şey almanız gerekiyor?


Rsync'e ihtiyacım yok, ama uzak olması gerekiyor
Rory

Ah hayır, ssh!
womble

1

Kyle'ın cevabını genişletmek için bu işlemi otomatik hale getirir. Tamamen denenmemiş, muhtemelen oldukça kırılgan olduğunu ve bilgisayarınızı silebildiğini ve köpeğinizi öldürebileceğini unutmayın.

#!/bin/bash

REMOTE=${1?Missing Remote Path}
LOCAL=${2?Missing Local Path}

# Trim trailing slash since we'll be adding it as a separator later
REMOTE=${REMOTE%/}
LOCAL=${LOCAL%/}

#Break it down
RHOST=${REMOTE%:*}
RPATH=${REMOTE#*:}

while read FILE; do
    diff -u ${LOCAL}/${FILE} <(ssh $RHOST "cat ${RPATH}/${FILE}")
done < <(rsync -vrn $REMOTE/ $LOCAL/ | sed '1d;/^$/q')

0

Rsync algoritması, dosyanın ikili parçalarını karşılaştırarak çalışır. Bu ikili farkın yazdırılabilir olması amaçlanmamıştır. İkili bir fark oluşturmak için rsync algoritmasını kullanan rdiff adlı bir komut var , ancak açıkladığınız şey için yararlı olacağını düşünmüyorum, genellikle artımlı yedekleri uygulamak için kullanılır.

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.