Wie kopiere ich nur Dateiattribute (Metadaten) ohne den eigentlichen Inhalt der Datei?

Wie kopiere ich nur Dateiattribute (Metadaten) ohne den eigentlichen Inhalt der Datei?

Ich habe bereits Terabyte an Dateien mit kopiert, rsyncaber vergessen, --archivedie besonderen Attribute der Dateien beizubehalten.

Ich habe es rsyncdieses Mal noch einmal versucht, --archiveaber es war viel langsamer als erwartet. Gibt es eine einfache Möglichkeit, dies schneller zu machen, indem man Metadaten einfach rekursiv kopiert?

Antwort1

Ok, Sie können Besitzer, Gruppe, Berechtigung und Zeitstempel mit dem --referenceParameter chown, chmod, kopieren touch. Hier ist ein Skript dazu

#!/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

Sie sollten es mit (um chown zuzulassen) und mit zwei Parametern ausführen sudo: Quell- und Zielverzeichnis. Das Skript gibt nur aus, was es tun würde. Wenn es zufrieden ist, ändern Sie die Zeile myecho=echomit myecho=.

Antwort2

Behandlung der Frage als „rsync kann nur Metadaten kopieren, warum ist es also so langsam und wie kann ich es schneller machen?“:

rsyncverwendet normalerweise gleiche Mtimes als Heuristik, um unveränderte Dateien zu erkennen und zu überspringen. Ohne --archive(insbesondere ohne --times) bleiben die Mtimes der Zieldateien auf den Zeitpunkt eingestellt, zu dem Sie sie per rsync synchronisiert haben, während die Mtimes der Quelldateien unverändert bleiben (ohne manuelle Tricks von Ihnen). Ohne externe Garantien von Ihnen, dass sich der Inhalt der Quelldateien nicht geändert hat, muss rsync davon ausgehen, dass sich dies möglicherweise geändert hat, und muss daher eine Prüfsumme erstellen und/oder sie erneut zum Ziel kopieren. Dies und die Tatsache, dass dies --whole-filefür lokale->lokale Synchronisierungen impliziert ist, macht rsyncohne --timesungefähr gleichwertig mit cpfür lokale Synchronisierungen.

Vorausgesetzt, dass das Aktualisieren des Inhalts der Zieldateien akzeptabel ist oder die Quelldateien seit der Originalkopie unverändert blieben, sollte es rsync --archive --size-onlyschneller gehen als mit einem einfachen rsync.

Wenn Sie sich nicht sicher sind, warum rsyncdas Kopieren so lange dauert, rsync --archive --dry-run --itemize-changes ...erfahren Sie alles in erschöpfenden, wenn auch knappen Einzelheiten.

Antwort3

ACHTUNG: Ohne spezielle Workarounds cp --attributes-onlykürzt GNU die Zieldateien, zumindest in Precise. Siehe die Bearbeitung unten.

Original:

In dieser Situation möchten Sie wahrscheinlich die Option von GNU cp --attributes-onlyzusammen mit verwenden, --archiveda es sich dabei um bewährten Code handelt, der alle dateisystemunabhängigen Attribute ausführt und keinen symbolischen Links folgt (ihnen zu folgen kann schlecht sein!):

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

Wie bei Dateien cpist es additiv mit erweiterten Attributen: wenn sowohl Quelle als auch Ziel erweiterte Attribute haben,fügt hinzudie erweiterten Attribute der Quelle zum Ziel (anstatt zuerst alle xattrs des Ziels zu löschen). Dies spiegelt zwar das cpVerhalten wider, wenn Sie Dateien in einen vorhandenen Baum kopieren, entspricht aber möglicherweise nicht Ihren Erwartungen.

Beachten Sie auch, dass, wenn Sie beim ersten Mal keine Hardlinks beibehalten haben, rsyncdiese aber jetzt beibehalten möchten,cp Gewohnheitbeheben Sie das für Sie; Sie sind wahrscheinlich am besten dran, es rsyncmit den richtigen Optionen erneut auszuführen (siehe meineandere Antwort) und Geduld zu haben.

Wenn Sie diese Frage gefunden haben, während Sie nachabsichtlichMetadaten/Dateiinhalte trennen und neu kombinieren möchten, dann sollten Sie einen Blick aufMetastore - Der Metastorewelches sich in den Ubuntu-Repositories befindet.

Quelle:GNU Coreutils-Handbuch


Bearbeitet, um hinzuzufügen:

cpab GNU coreutils>= 8.17 und höher funktionieren wie beschrieben, aber coreutils <= 8.16 kürzen Dateien beim Wiederherstellen ihrer Metadaten. Im Zweifelsfall verwenden Sie es nicht cpin dieser Situation; verwenden Sie es rsyncmitdie richtigen Optionenund/oder geduldig sein.

Ich würde dies nicht empfehlen, es sei denn, Sie verstehen genau, was Sie tun, aber frühere GNU-Versionen cpkönnen daran gehindert werden, Dateien zu kürzen, indem manLD_PRELOAD-Trick:

/*
 * 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);
}

Antwort4

Bei lokalen Übertragungen, wenn Quelle und Ziel auf lokal gemounteten Dateisystemen liegen, rsyncwird immer der gesamte Dateiinhalt kopiert. Um dies zu vermeiden, können Sie verwenden

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

verwandte Informationen