既にテラバイトのファイルをコピーしましたrsync
が、--archive
ファイルの特別な属性を保持するために使用するのを忘れていました。
rsync
今回はもう一度実行してみました--archive
が、予想よりもずっと遅くなりました。メタデータを再帰的にコピーするだけで、これを簡単に行う簡単な方法はありますか?
既にテラバイトのファイルをコピーしましたrsync
が、--archive
ファイルの特別な属性を保持するために使用するのを忘れていました。
rsync
今回はもう一度実行してみました--archive
が、予想よりもずっと遅くなりました。メタデータを再帰的にコピーするだけで、これを簡単に行う簡単な方法はありますか?
回答:
[OK]を、あなたが使用して、所有者、グループ、権限およびタイムスタンプをコピーすることができます--reference
にパラメータをchown
、chmod
、touch
。そのためのスクリプトを次に示します
#!/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
sudo
(chownを許可するために)および2つのパラメーター(sourceおよびdestinationディレクトリ)を使用して実行する必要があります。スクリプトは、実行内容をエコーするだけです。満足したら、行myecho=echo
をで変更しmyecho=
ます。
touch --reference=otherfile file
。回答を更新しました
touch
設計上、変更時間とアクセス時間のみを変更するため、「作成」時間は影響を受けません。(とにかくext2 / 3はctimeの変更をサポートしていないと思いますが、NTFSなどを使用している場合は問題になるかもしれません)。
-c
は、touch
コマンドにスイッチを追加して、で空のファイルの作成を停止します$dst_path
。
警告:特別な回避策がなければ、GNU cp --attributes-only
は少なくとも正確に宛先ファイルを切り捨てます。以下の編集を参照してください。
元の:
この状況では、おそらくGNU cpの--attributes-only
オプションが必要です。これは--archive
、コードの試行とテストを行い、ファイルシステムに依存しない属性をすべて実行し、シンボリックリンクをたどりません(これに従わないことがあります)。
cp --archive --attributes-only /source/of/failed/backup/. /destination/
ファイルと同様に、cp
拡張属性を追加します。ソースと宛先の両方が拡張属性を持っている場合、ソースの拡張属性を宛先に追加します(宛先のxattrsをすべて削除するのではなく)。これcp
は、ファイルを既存のツリーにコピーした場合の動作をミラーリングしていますが、期待したものとは異なる場合があります。
また、最初にハードリンクrsync
を保存しcp
なかったが、今すぐ保存したい場合は、それを修正しないことに注意してください。おそらくrsync
、適切なオプションを使用して再実行し(他の回答を参照)、忍耐強い方がよいでしょう。
メタデータ/ファイルのコンテンツを意図的に分離して再結合しようとしているときにこの質問を見つけた場合は、Ubuntuリポジトリにあるメタストアを調べてください。
追加して編集:
cp
GNU coreutils
> = 8.17以降からは上記のように機能しますが、coreutils <= 8.16はメタデータを復元するときにファイルを切り捨てます。疑わしい場合はcp
、この状況で使用しないでください。適切なオプションを使用rsync
して、および/または我慢してください。
あなたが何をしているのかを完全に理解していない限り、これはお勧めしませんが、以前のGNU cp
はLD_PRELOADトリックを使用してファイルを切り捨てることを防ぐことができます。
/*
* 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);
}
errorno
であるべきerrno
ですよね?
rsync
が正しいオプションで呼び出すのは、別の質問への答えです...
質問を「rsyncはコピーするメタデータのみを持っているので、なぜそんなに遅いのですか、どうすれば速くできますか?」:
rsync
通常、未変更のファイルを検出してスキップするためのヒューリスティックとして等しいmtimesを使用します。なし--archive
(具体的には、なし--times
mtimeの(あなたによって手動策略を無視して)そのまま残る)先のファイルはソースファイル間、mtimeのは、あなたがそれらをrsyncの-ED時に設定されたままは。ソースファイルの内容が変更されていないことを外部から保証しない場合、rsyncはファイルが存在する可能性があると想定するため、チェックサムおよび/またはコピー先に再度コピーする必要があります。これに加え、実際に--whole-file
ローカルから>ローカル同期のために暗示されるが、作るrsync
なし--times
とほぼ同等cp
のローカル同期のために。
宛先ファイルのコンテンツの更新が許容される場合、またはソースファイルが元のコピーから変更されていない場合はrsync --archive --size-only
、単純なrsyncよりも迅速に検索する必要があります。
rsync
コピーに時間がかかっていることが疑わしい場合はrsync --archive --dry-run --itemize-changes ...
、簡潔な場合でも詳細を網羅的に説明します。
ローカル転送では、ソースと宛先がローカルにマウントされたファイルシステムにある場合、rsync
常にファイル全体のコンテンツがコピーされます。これを回避するには、次を使用できます
rsync -a --no-whole-file source dest
rsync
、ファイルが両方ともローカルパスにある場合にショートカットを使用しないように指示するために使用されますがrsync
、コンテンツのコピーを妨げません。
これを別のコンピューターにリモートで実行する必要があったため、-referenceを使用できませんでした
これを使ってスクリプトを作成しました...
find -printf "touch -d \"%Tc\" \"%P\"\n" >/tmp/touch.sh
ただし、最初に「」を含むファイル名がないことを確認してください...
find | grep '"'
次に、touch.shをリモートコンピューターにコピーして、実行します...
cd <DestinationFolder>; sh /tmp/touch.sh
find -printfには、ユーザー、グループ名をコピーする場合にそれらを印刷するオプションもあります。
find
ます。私は同じ状況にありました-属性をコピーするのを忘れて、ソースと宛先ディスクはすでに別のマシンにあり、本当にそれを元に戻したくありませんでした。