이미 테라 바이트 크기의 파일을 복사 rsync
했지만 --archive
파일의 특수 속성을 보존하는 데 사용 하는 것을 잊었습니다 .
rsync
이번에는 다시 실행을 시도했지만 --archive
예상보다 느립니다. 메타 데이터를 재귀 적으로 복사하여이 작업을 더 빠르게 수행 할 수있는 쉬운 방법이 있습니까?
이미 테라 바이트 크기의 파일을 복사 rsync
했지만 --archive
파일의 특수 속성을 보존하는 데 사용 하는 것을 잊었습니다 .
rsync
이번에는 다시 실행을 시도했지만 --archive
예상보다 느립니다. 메타 데이터를 재귀 적으로 복사하여이 작업을 더 빠르게 수행 할 수있는 쉬운 방법이 있습니까?
답변:
좋아, 당신은 사용하여 소유자, 그룹, 권한 및 타임 스탬프를 복사 할 수 있습니다 --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을 허용하고 source 및 destination 디렉토리의 두 매개 변수를 사용 하여 실행해야합니다 . 스크립트는 수행 할 작업 만 에코합니다. 만족하면로 줄 myecho=echo
을 변경하십시오 myecho=
.
touch --reference=otherfile file
. 답변 업데이트
touch
설계에 따라 수정 및 액세스 시간 만 변경되므로 "작성"시간은 영향을받지 않습니다. (ext2 / 3는 ctime 변경을 지원하지 않지만 NTFS 등을 사용하는 경우 중요 할 수 있다고 생각합니다).
-c
경우 touch
명령에 스위치를 추가하여 파일에서 빈 파일 생성을 중지하십시오 $dst_path
.
경고 : 특별한 해결 방법이 없으면 GNU cp --attributes-only
는 최소한 Precise에서 대상 파일을 자릅니다. 아래 편집을 참조하십시오.
기발한:
이 상황에서는 GNU cp의 --attributes-only
옵션과 함께 --archive
코드를 시도하고 테스트 한 모든 파일 시스템과 무관 한 속성을 수행하고 심볼릭 링크를 따르지 않습니다 (나중에 나쁠 수 있습니다!).
cp --archive --attributes-only /source/of/failed/backup/. /destination/
파일과 마찬가지로 cp
확장 된 속성이있는 추가 기능입니다 . 소스 와 대상 모두에 확장 된 속성이 있으면 대상의 모든 xattrs를 먼저 삭제하지 않고 소스의 확장 된 속성을 대상에 추가 합니다. cp
기존 트리에 파일을 복사 할 때 동작 방식을 반영하지만 예상 한 것과 다를 수 있습니다.
또한 처음에 하드 링크를 보존하지 않았지만 rsync
지금 보존하려는 cp
경우에는이를 해결 하지 않습니다 . rsync
올바른 옵션으로 다시 실행 하고 ( 다른 답변 참조 ) 인내 하는 것이 가장 좋습니다 .
메타 데이터 / 파일 내용 을 고의로 분리하고 재구성 하는 동안이 질문을 발견 한 경우 우분투 리포지토리에있는 메타 스토어 를 살펴볼 수 있습니다 .
출처 : GNU coreutils 매뉴얼
추가하기 위해 편집 :
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
) 대상 파일 mtimes (당신에 의해 수동 속임수를 무시) 그대로 유지 'mtimes은 당신이 시간으로 설정 유지 소스 파일 동안, 그들을 rsync는-에드'가. 소스 파일의 내용이 변경되지 않았다는 외부 보증이 없으면 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
내용을 복사 하지 못하게하지는 않습니다 .
다른 컴퓨터에서 원격 으로이 작업을 수행하여 사용할 수 없었습니다.
나는 이것을 스크립트를 만들기 위해 사용했다 ...
find -printf "touch -d \"%Tc\" \"%P\"\n" >/tmp/touch.sh
그러나 먼저 파일 이름에 "가있는 파일 이름이 없는지 확인하십시오.
find | grep '"'
그런 다음 touch.sh를 원격 컴퓨터에 복사하고 실행하십시오.
cd <DestinationFolder>; sh /tmp/touch.sh
find -printf에는 복사 할 사용자, 그룹 이름을 인쇄하는 옵션도 있습니다.
find
. 나는 같은 상황에 있었다-속성, 소스 및 대상 디스크를 이미 다른 기계에 복사하는 것을 잊어 버렸고 실제로 그것을 바꾸고 싶지 않았습니다 .