Dosyanın içeriği olmadan sadece dosya özniteliklerini (meta veri) nasıl kopyalarım?


21

Zaten terabaytlık dosyaları kopyaladım rsyncancak --archivedosyaların özel özelliklerini korumak için kullanmayı unuttum .

rsyncBu sefer tekrar idam etmeye çalıştım --archiveama beklediğimden çok daha yavaştı. Yalnızca meta verileri yinelemeli olarak kopyalayarak daha hızlı yapmanın kolay bir yolu var mı?


"Meta veri" ile dosya izinleri ve dosya sahipliği veya genişletilmiş dosya öznitelikleri gibi daha karmaşık şeyleri mi kastediyorsunuz?
Marcel Stimberg

Kaynak dosyaların bulunduğu dosya sistemi yerel olarak mı kurulur?
enzotib

meta verilerle, izinleri ve zaman damgalarını kastediyorum. zaman damgaları benim için özellikle önemli.
Mohammad

Hem kaynak hem de varış yerindeki dosya sistemi yerel olarak monte edilir.
Mohammad

Yanıtlar:


17

Tamam, kullandığınız sahibi, grup, izin ve damgaları kopyalayabilirsiniz --referenceparametreyi chown, chmod, touch. İşte bunu yapmak için bir komut dosyası

#!/bin/bash
# Filename: cp-metadata

myecho=echo
src_path="$1"
dst_path="$2"

find "$src_path" |
  while read src_file; do
    dst_file="$dst_path${src_file#$src_path}"
    $myecho chmod --reference="$src_file" "$dst_file"
    $myecho chown --reference="$src_file" "$dst_file"
    $myecho touch --reference="$src_file" "$dst_file"
  done

sudoKaynak ve hedef dizin: (chown'a izin vermek için) ve iki parametre ile çalıştırmalısınız . Senaryo sadece yapacağı şeyi tekrarlar. Memnun değişim çizgisi ise myecho=echoile myecho=.


1
Evet, ihtiyacım olan şey bu: - chmod'daki referans. Teşekkür ederim. Ve eğer biri zaman damgasını kopyalamak için chmod gibi bir şey tanıtabiliyorsa, gerçekten takdir ediyorum.
Mohammad

1
@Mohammad: Bunun için kullanabilirsiniz touch --reference=otherfile file. Cevap güncellendi
enzotib 12:11

Bu harika. Aslında ben şimdi dokunmatik kılavuzu okuyordum ;-)
Mohammad,

Sadece bir not: touchtasarım sadece değişiklik ve erişim zamanlarını değiştirir, "yaratma" zamanı etkilenmez. (Ext2 / 3'ün yine de ctime değiştirmeyi desteklemediğini düşünüyorum, ancak NTFS veya benzeri kullanıyorsanız bunun önemi olabilir).
Amro

Yalnızca mevcut dosyaların meta verilerini değiştirmek istediğinizde ve dosyaların varlığından emin olmanız gerekmiyorsa, içinde boş dosyalar oluşturmasını durdurmak -ciçin touchkomuta bir anahtar ekleyin $dst_path.
Synchro

5

UYARI: Özel geçici çözümler olmadan, GNU cp --attributes-onlyhedef dosyaları en azından Kesin olarak keser. Aşağıdaki düzenlemeye bakınız.

Orijinal:

Bu durumda, muhtemelen denenmiş ve test edilmiş bir kodla --attributes-onlybirlikte GNU cp'nin seçeneğinin --archivetüm dosya sistemi-agnostik özniteliklerini yapmasını ve sembolik izleri izlemesini istemezsiniz (bunları izlemeniz kötü olabilir!):

cp --archive --attributes-only /source/of/failed/backup/. /destination/

Dosyalarda cpolduğu gibi , genişletilmiş özelliklere eklenir : hem kaynak hem de hedef genişletilmiş özelliklere sahipse , kaynağın genişletilmiş niteliklerini hedefe ekler (ilk önce hedefin tüm xattr'lerini silmek yerine). Bu, cpdosyaları mevcut bir ağaca kopyaladığınızda nasıl davrandığını yansıtsa da, beklediğiniz gibi olmayabilir.

Ayrıca, ilk kez zor bağlantıları korumazsanız, rsyncancak şimdi korumak istiyorsanız, o cp zaman bunu sizin için düzeltmeyeceğinizi unutmayın; Muhtemelen rsync, doğru seçeneklerle uğraşmakta en iyisisin ( diğer cevabımı gör ) ve sabırlı ol.

Meta veri / dosya içeriğini kasıtlı olarak ayırıp yeniden birleştirmeyi ararken bu soruyu bulursanız , Ubuntu depolarındaki metastore'a bakmak isteyebilirsiniz .

Kaynak: GNU coreutils manual


Eklemek için düzenlendi:

cpGNU'dan coreutils> = 8.17 ve üzeri açıklandığı gibi çalışacaktır, ancak <= 8.16 çekirdekleri meta verilerini geri yüklerken dosyaları kesecektir. Şüpheniz varsa, cpbu durumda kullanmayın ; kullanmak rsyncile sağ seçenekleri ve / veya sabırlı olun.

Ne yaptığınızı tam olarak anlamadığınız sürece bunu tavsiye etmem, ancak daha önce GNU'nun LD_PRELOAD numarasınıcp kullanarak dosyaları kısaltması engellenebilir :

/*
 * File: no_trunc.c
 * Author: D.J. Capelis with minor changes by Zak Wilcox
 *
 * Compile:
 * gcc -fPIC -c -o no_trunc.o no_trunc.c
 * gcc -shared -o no_trunc.so no_trunc.o -ldl
 *
 * Use:
 * LD_PRELOAD="./no_trunc.so" cp --archive --attributes-only <src...> <dest>
 */

#define _GNU_SOURCE
#include <dlfcn.h>
#define _FCNTL_H
#include <bits/fcntl.h>

extern int errorno;

int (*_open)(const char *pathname, int flags, ...);
int (*_open64)(const char *pathname, int flags, ...);

int open(const char *pathname, int flags, mode_t mode) {
        _open = (int (*)(const char *pathname, int flags, ...)) dlsym(RTLD_NEXT, "open");
        flags &= ~(O_TRUNC);
        return _open(pathname, flags, mode);
}

int open64(const char *pathname, int flags, mode_t mode) {
        _open64 = (int (*)(const char *pathname, int flags, ...)) dlsym(RTLD_NEXT, "open64");
        flags &= ~(O_TRUNC);
        return _open64(pathname, flags, mode);
}

errornoolmalı errno, değil mi?
enzotib

Hızlı bir testin kaldırılması işe yaramış gibi görünüyor, sanırım orjinalinde fazlalık / hata yaptım ama herkes şimdiye kadar daha yeni coreutil'lerde olacak.
ZakW

ama rsyncdoğru seçeneklerle söylediğin şey , başka bir sorunun cevabı ...
Jean Paul

5

Soruyu "rsync yalnızca kopyalamak için meta verilere sahip, neden bu kadar yavaş ve neden daha hızlı yapabilirim?" Olarak kabul etmek:

rsyncgenellikle değişmeyen dosyaları algılamak ve atlamak için eşit mtimesleri bir sezgisel olarak kullanır. Olmadan --archive(özellikle, olmadan --times) hedef dosyaların zamanları, onları dolaştığınız zamana ayarlanmış olarak kalır, kaynak dosyaların zamanları bozulmadan kalır (sizin tarafınızdan elle yapılan kandırmayı göz ardı ederek). Sizden kaynak dosyalarının içeriğinin değişmediğine dair dış güvenceler olmadan, rsync sahip olabileceğini varsaymak zorundadır ve bu nedenle bunları kontrol etmeli ve / veya hedeflerine tekrar kopyalamalıdır. Bu, artı aslında --whole-fileyerel-> yerel senkronizerlerine ima yapar rsyncolmadan --timesyaklaşık olarak eşdeğer cpyerel senkronizerlerine.

Hedef dosyalarının içeriğinin güncellenmesi kabul edilebilirse veya orijinal dosyadan beri kaynak dosyalara dokunulmazsa, rsync --archive --size-onlysaf bir rsync'ten daha hızlı bulmalısınız .

rsyncKopyalamanın ne kadar uzun sürdüğüne dair şüpheniz varsa rsync --archive --dry-run --itemize-changes ..., size ayrıntılı ve ayrıntılı bilgi verir.


1
Çok faydalı bilgi. - archive --size-only sadece büyük bir combo. Yalnızca hedefte önceden var olan dosyaların kopyalanmasını engellemekle kalmaz, aynı zamanda meta verilerini de günceller. Bu benim için beklenmedik bir durumdu çünkü rsync'in man sayfası - sadece boyları uyuşan "atlama" olarak tanımladı. Sadece kopyayı atladığı, ancak meta verileri yine de senkronize edeceği ortaya çıktı. İdeal.
Chad von Nau

2

Yerel aktarımlarda, kaynak ve hedef yerel olarak bağlı dosya sistemlerinde olduğunda, rsyncher zaman tüm dosya içeriğini kopyalar. Bunu önlemek için kullanabilirsiniz

rsync -a --no-whole-file source dest

-No-bütün-dosya ve - ilerleme ile rsync'i denedim ve hala kopyalama işlemini görebiliyorum (yaklaşık 30 MB / sn); Bu yüzden henüz yeterince hızlı değil sanırım. Rsync konusundaki umudumu kaybediyorum ...
Mohammad

Bu seçenek, rsyncher ikisi de yerel yoldayken kısayolu kullanmamak için kullanılır, ancak rsynciçeriği kopyalamayı engellemez .
Jean Paul

2

Bunu başka bir bilgisayara uzaktan yapmak zorundaydım, bu yüzden kullanamadım -

Bunu senaryoyu yapmak için kullandım ...

find -printf "touch -d \"%Tc\" \"%P\"\n" >/tmp/touch.sh

Ama önce içlerinde "ile bir dosya adı olmadığından emin olun ...

find | grep '"'

Ardından touch.sh dosyasını uzaktaki bilgisayara kopyalayın ve çalıştırın ...

cd <DestinationFolder>; sh /tmp/touch.sh

Kullanıcıyı bulmak için print-find seçeneğinde, bunları kopyalamak istiyorsanız grup adı da vardır.


Fikirleri için teşekkürler a) "Sadece bir kabuk komut dosyası kullanın" ve b) kullanarak söz konusu komut dosyasını oluşturun find. Aynı durumdaydım - öznitelikleri kopyalamayı unuttum, kaynak ve hedef diskler zaten farklı makinelerde bulundular ve gerçekten bunu tersine çevirmek istemiyorlardı.
i336_
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.