Bir USB anahtarını yeniden bağladığımda sütunları nasıl değiştirebilirim?


12

Posta dizinimi bir USB anahtarına yedeklemek istiyorum. Ancak, benim IMAP bir şey iki nokta üst üste (:) karakteri içeren garip bir adlandırma kuralı vardır. USB bir pencere biçiminde olduğundan, rsync bu dosyayı oluşturamaz. Rsync'i çalıştırırken iki nokta üst üste karakterini alt çizgi ile değiştirmenin bir yolu var mı? (Ya da aynı senkronizasyonu başka bir araçla mı yapmak istiyorsunuz?)

Yorumlarda açıklığa kavuştuğum birkaç nokta:

  • Bu en kötü durum senaryosu yedeğidir, bir şey yüklemeden bir Windows makinesinde okumak istiyorum.
  • Sabit kalan çok fazla verim var. Bu yüzden sadece yeni dosyaları kopyalayan bir aracım varsa çok zaman kazanıyorum.
  • Rsync'in yeniden yazılmasını aramıyorum. Kutunun dışında kullanılabilecek mevcut bir araç arıyorum.

Teşekkürler

Yanıtlar:


8

Kullanım rdiff-yedekleme yerine düz rsync. Hedef diskte desteklenmeyen karakterleri otomatik olarak algılar ve değiştirir ve ayrıca bir unix dosya sistemine geri yüklerken oldukları gibi geri koyar. Kökeni artı bir ekstra meta veri dizini gibi görünen paketsiz bir dizin üretir.


6

En basit yaklaşım, dosya adlarını dönüştürmek için dosya sistemi katmanından yararlanmaktır. Ubuntu 12.04'ten beri, dosya adlarını Windows VFAT'in desteklediği adlara dönüştüren bir FUSE dosya sistemi var: fuse-posixovl Sigorta-posixovl'u takın .

sudo mount.posixovl /media/sdb1
chown guillaume /media/sdb1
rsync -au ~/mail /media/sbd1/

Veya root erişimi gerektirmekten kaçınmak için:

mkdir ~/mnt
/sbin/mount.posixovl -S /media/sdb1 ~/mnt
rsync -au ~/mail ~/mnt/

VFAT kabul etmediğini dosya adlarında karakterler olarak kodlanmıştır %(XX)nerede XXonaltılık basamak vardır. POSIXovl 1.2.20120215'ten itibaren, gibi bir dosya adının %(3A)kendisinin kodlandığı ve kodunun çözüleceğine dikkat edin :, bu nedenle formun alt dizelerini içeren dosya adlarınız varsa çarpışma riski vardır %(XX).

POSIXovl'un çok uzun dosya adlarıyla başa çıkmadığına dikkat edin. Kodlanan ad 255 karaktere sığmıyorsa, dosya kaydedilemez.

POSIXovl, unix izinlerini ve sahipliğini çağrılan dosyalarda saklar .pxovl.FILENAME.


Aşağıdaki bash ≥4 komut dosyası kopyaları ~/mail/foo:bariçin /media/usb99/mail/foo_bar, ve benzer altındaki tüm dosyalar için ~/mail. Hedef ağaçta zaten var olan ve kaynaktan daha eski olmayan dosyalar atlanır.

#!/bin/bash
set -e
shopt -s dotglob globstar
for source in "$HOME"/mail/**/*; do
  target=/media/usb99/${source#"$HOME"/}
  target=${target//:/_}
  if [[ -d $source ]]; then
    mkdir -p -- "$target"
  elif [[ $target -ot $source ]]; then
    cp -p -- "$source" "$target"
  fi
done

Bu komut dosyası küçük modifikasyonlarla zsh altında çalışır: yerine shopt -s dotglob globstargöre setopt dot_globve [[ $target -ot $source ]]tarafından [[ ! -e $target || $target -ot $source ]].


İşte bir zsh iki astar (otomatik yükleri sayarsanız üç). Daha kısa, ancak oldukça gelişmiş ve çok okunabilir değil.

autoload zargs zmv
zargs -- ~/mail/**/*(/e\''REPLY=/media/usb99/${${REPLY#$HOME/}//:/_}'\') -- mkdir -p --
zmv -C -Q -o -pu '~/mail/(**/)(*)(.)' '/media/usb99/mail/${1//:/_}${2//:/_}'
  • zargsÇizgi eşdeğerdir mkdir -p ~/mail/**/*(…)dizin adlarının kümülatif uzunluğu çok uzun ise dışarı bomba olmaz dışında. Bu satır, gerektiği şekilde hedef dizinleri oluşturur.
  • ~/mail/**/*(/)altındaki tüm dizinlere genişler ~/mail(sadece (/)sondaki dizinler nedeniyle ).
  • (/e\''…'\')yalnızca dizinleri seçer ve REPLYdeğişkende saklanan her dosya adını dönüştürmek için '…' içindeki kodu çalıştırır .
  • ${${REPLY#$HOME/}//:/_}kaynak dizin ve değişiklikler ile ilgili önek kaldırır :içine _.
  • zmv -C ilk işleneniyle (zsh deseni) eşleşen her dosyayı ikinci işlenenini genişleterek elde edilen dosya adına kopyalar.
  • -o -puizinleri korumak ve yalnızca güncellenmiş dosyaları kopyalamak -puiçin cpyardımcı programa geçmeyi söylüyor . (Zsh'ye güncelleme kontrolünü yapmasını söyleyebiliriz; biraz daha hızlı ama daha şifreli olurdu.)
  • (.)yalnızca normal dosyaları seçer. -Qbunun, .bir alt ifadeyi gösteren parantez içinde değil, bir glob niteleyicisi olarak ayrıştırılacağını söylüyor .
  • $1ve $2değiştirilen metinde parantez içindeki ifadelerle eşleşir (**/)ve *. ( **parantez tam olarak belirtilmedikçe, parantez içinde ise özel anlamını sıfır veya daha fazla alt dizin düzeyi olarak kaybeder **/.)

Başlangıçta bir dosya yeniden adlandırma özelliği ( seçenek) olan bir arşivleme aracı (burada geçiş modunda kullanılmak üzere tasarlanmıştır) olan pax kullanmayı düşündüm -s. Ancak -sve -useçenekleri birlikte çalışmaz ( pax'un POSIX tanımı,-u dönüştürülen dosya adından ziyade aynı adda bir dosyayı hedef ağaçta kontrol etmesi gerektiğini söyler -s; Ubuntu'daki pax uygulaması, tam anlamıyla faydalı bir şekilde). Yeniden adlandırılmış sabit bağlantılar yapmak ve bundan sonra sabit bağlantıları ( rsync -auveya ile pax -rw -pp -u) diğer medyaya kopyalamak için kullanmak hala mümkündür , ancak değerinden daha fazla sorun çıkarır.

cd ~/mail
mkdir -p /media/usb99/mail
pax -rw -l -pp -s '!:!_!g' . ../mail.colonless
rsync -au ../mail.colonless/ /media/usb99/mail/

Ben pax kullanmaya çalışacağım. Belki de ubuntu için gereken paketi belirterek cevabınızı geliştirebilirsiniz. Normal kurulumun bir parçası gibi görünmüyor.
Guillaume Coté

Sadece pax adlı tek bir paket ekleyerek çalışmasını sağlayın.
Guillaume Coté

Hiçbir şey çıktı almaz, neler olduğunu görmek için -v seçeneği eklemeye çalışırım. Her şeyi her seferinde kopyalıyor gibi görünüyor. Rsync'in noktası artımlı olmaktır, bu da çok fazla dosyanın ortasında birkaç değiştirilmiş dosyam olduğunda çok zaman kazanmamı sağladı.
Guillaume Coté

Belirttiğim yolun altında bir 'ev' dizini oluşturuyor gibi görünüyor. Koddaki dizini değiştirmekten kaçınılması önerilir, tüm bu dizinlerin oluşturulmasını önlemek için başka bir olasılık var mı?
Guillaume Coté

Her şeyin özdeş olduğu ikinci bir geçişte beş dakika sürdü. rsync sadece birkaç saniye sürecekti. Artımlı hale getirmek için belirtilmesi gereken bir seçenek var mı?
Guillaume Coté

-1

USB bellek çubuğum ve mobil USB diskimle yaptığım, bunları 2 bölümle ayırmaktır: FAT32 bir ve bir ext4. İlki linux olmayan kullanıcılarla veri alışverişinde bulunmak için kullanabilirim, ikincisi Ubuntu sistemlerimle kişisel kullanımım için (ve belki de diğer linux kullanıcılarıyla alışveriş yapmak için). Bir ext4 bölümünde ":" sorunu yaşamayacaksınız.


Windows bilgisayarında bir bilgiye ihtiyacım olduğunda yedeklememin herhangi bir yerde okunabilir olmasını istiyorum. Değilse, usb anahtarını bir unix dosya sistemine yeniden biçimlendirirdim. Bu yüzden oyuncu değişikliği istiyorum.
Guillaume Coté

Eh, ise bazı araçlar veya dosya sistemi sürücüleri yüklerseniz Windows üzerinde en az ext2 / ext3 okumak mümkün. Her Windows sisteminde veya yalnızca kendi sistemlerinizde (ihtiyaç duyduğunuzda gerekli araçları yükleyebileceğiniz yer) okumak ister misiniz?
JanC

BTW: Teorik olarak bunu bir NTFS sisteminde de saklamak mümkün olmalı, ancak çoğu Windows uygulaması (Microsoft'tan çoğu dahil)
NTFS'yi

En kötü durum kurtarma yedeği, bu yüzden hızlı bir şeye ihtiyaç duyduğumda bir bilgisayara herhangi bir şey yükleme hakkım yok.
Guillaume Coté

-2

tarBir arşiv oluşturmak için kullanabilirsiniz . Bu şekilde adları değiştirmek zorunda kalmazsınız ve istediğiniz dosya sistemine kaydedebilirsiniz.


Aynı şeyi bir zip dosyası veya bir tgz ile de yapabilirdim, ancak her seferinde değişmeyen dosyayı yeniden yazacak. Medya sınırlı sayıda yazma ve birkaç Gib veri aldığım için, sadece yeni bir 1kb dosyası eklendiği için her şeyi yeniden yazmaktan kaçınmak istiyorum.
Guillaume Coté

Yakın zamanda yapılan bir flash bellekteki yeniden yazma işlemleri genellikle birkaç milyon veya en az yüz binlerce ile "sınırlıdır". Bu kadar çok yedekleme yapmayı planladığınızdan şüpheliyim. ;)
JanC

2
-1 -azv bir arşiv oluşturmaz, bir arşiv modu kopyası yapar, bu da dosya özniteliklerini koruduğu anlamına gelir
João Pinto

sry, rsync'in gerçekten yapabileceğini düşündüm, katran olarak değişti, ama katranın artımlı yedeklemeler yapıp yapamayacağını bilmiyorum. Ancak JanC haklı ve yeniden yazma sorunu olmamalı.
david

JanC, yeniden yazmalarla ilgili yorumlarla ilgili olarak, sadece bir sınır olduğu gerçeği değil (son kontrol ettiğimde, binde bir milyona yakındı), aynı zamanda bir şey için birkaç saat beklemek istemediğim gerçeği bir dakikadan az olmalıdır.
Guillaume Coté
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.