Gerçek aktarımı daha sonra hızlandırmak için rsync - dry-run çıkışını yeniden kullanın.


23

Genelde rsync -ngerçek yapmadan önce yaparım rsync. Mesele şu ki, üretilen listeyi tekrar kullanmak için ikinci çalıştırmayı nasıl otomatikleştirebilirim --dry-run?

Yani, rsync -nkoşarsam ne rsyncyapacağıma dair bir simülasyon elde edersem , benim fikrim o çıktıyı almak, onu bir şekilde işlemek, sonra da rsyncsadece --include-frombu çıktıyı yapmaktır , bu yüzden tam liste sadece bir kez hesaplanmalıdır.

Bu bile mantıklı gelmezse, lütfen bana bildirin.

Bu arada, kullanma eğilimindeyim rsync -hva --progress --stats --delete --exclude-from "$EXCLUDEFILE". Ayrıca, hangi seçenekleri kullanacağınıza dair bir öneriniz varsa, lütfen bana bildirin. Harici bir sabit sürücünün içeriğini (yalnızca görüntüler, videolar ve belgeler içeren) başka bir harici sabit sürücüye kopyalamaya çalışıyorum.


Çıktıyı --dry-runkomuttan bir dosyaya (örneğin rsync --dry-run -avz SOURCE DEST > include.txt) yönlendirmeyi, dosya / yol olmayan tüm satırları include.txt'den çıkarmayı ve çalıştırmayı deneyebilirsiniz rsync --include-from include.txt.
ThatGuy,

Bu son komut olmalı rsync --include-from include.txt --exclude=* SOURCE DEST. Ayrıntılar için stackoverflow.com/a/19296415/1765910 adresine bakın.
ThatGuy,

Evet, fikir bu, ama aslında bunu nasıl yapacağımı bilmiyorum (artı ne yaptığını gerçekten bilen birinden onay almak istiyorum). Sadece kullanıyorum rsyncama kabuk komutlarından / bash'larından hiçbir şey bilmiyorum…
Manuel

Yanıtlar:


18

Bir kuru çalıştırma sırasında oluşturulan dosya listesini bir içerme dosyası olarak kullanmak kesinlikle mümkündür. Bununla birlikte, ideal olarak, kuru çalıştırma çıktısının üstündeki ve altındaki ekstra çizgiler silinmelidir.

Örnek çıktı:

sending incremental file list
[LIST OF FILES]

sent 226 bytes  received 34 bytes  520.00 bytes/sec
total size is 648,373,274  speedup is 2,493,743.36 (DRY RUN)

Bu çizgileri çıkarmak için, rsyncçıkışı içine headve içine yerleştirin tail. Ardından, işlenen çıktıyı include dosyasına kaydedin:

rsync --dry-run -avz source/ destination/ | head --lines=-3 | tail --lines=+3 > include.txt

Son olarak, rsyncoluşturulan include dosyasını kullanmasını söyleyin (istediğiniz gibi ek seçenekler ekleyin):

rsync --include-from=include.txt --exclude=* source/ dest/


Bununla ilgili sorun, silinmesi gereken dosyalarla başa çıkmamasıdır. Ve bu , yalnızca dosya listesine sahip olmayı sağlayacak kadar güçlü tail/ yöntem headmidir?
Manuel

Ekleme --delete, kaynak dizinlerden silinen dosyaların hedef dizinlerden de silinmesine neden olur, en azından denediğim bilgisayarda. tail/ headKısmını tamamen dışarıda bırakabilirsiniz . rsyncinclude dosyasındaki her satırı bir dosya adı olarak yorumluyor ve var olmayan dosyaları görmezden geliyor, bu yüzden fazladan satır tutarsanız hiçbir şey olmayacak ("artımlı dosya listesi gönderme" adlı dosyalara sahip değilseniz, bu durumda bu dosyalar da kopyalanacaktır).
ThatGuy,
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.