이미 테라바이트 단위의 파일을 복사했지만 파일의 특수 속성을 보존하는 데 rsync
사용하는 것을 잊어버렸습니다 .--archive
rsync
이번에 다시 실행해 보았 --archive
으나 예상했던 것보다 훨씬 느렸습니다. 메타데이터를 재귀적으로 복사하여 이 작업을 더 빠르게 수행할 수 있는 쉬운 방법이 있습니까?
답변1
좋습니다. 매개변수를 사용하여 소유자, 그룹, 권한 및 타임스탬프를 , , --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을 허용하려면 소스 및 대상 디렉토리라는 두 개의 매개변수를 사용 하여 실행해야 합니다 . 스크립트는 수행할 작업만 반영합니다. 만족스러우면 로 줄을 변경 myecho=echo
하십시오 myecho=
.
답변2
질문을 "rsync에는 복사할 메타데이터만 있는데 왜 이렇게 느리고 어떻게 하면 더 빠르게 만들 수 있나요?"로 처리합니다.
rsync
일반적으로 변경되지 않은 파일을 감지하고 건너뛰기 위해 동일한 mtimes를 경험적 방법으로 사용합니다. 없는 경우 --archive
(구체적으로 가 없는 경우 --times
) 대상 파일의 mtime은 rsync를 수행한 시간으로 설정된 상태로 유지되는 반면 소스 파일의 mtime은 그대로 유지됩니다(사용자의 수동 속임수 무시). 소스 파일의 내용이 변경되지 않았다는 외부 보증이 없으면 rsync는 내용이 변경되었을 수 있다고 가정해야 하며 따라서 체크섬을 수행하거나 대상에 다시 복사해야 합니다. 여기에 --whole-file
로컬->로컬 동기화에 대해 암시된 사실이 더해지면 로컬 동기화 와 거의 동일 하지 rsync
않게 됩니다.--times
cp
대상 파일의 내용을 업데이트하는 것이 허용되거나 원본 파일 이후 원본 파일을 건드리지 않은 경우 rsync --archive --size-only
순진한 rsync보다 더 빨리 찾아야 합니다.
rsync
너무 오래 걸리는 복사 작업이 무엇인지 확실하지 않은 경우 rsync --archive --dry-run --itemize-changes ...
간결하면서도 철저하게 자세히 설명합니다.
답변3
경고: 특별한 해결 방법이 없으면 GNU는 cp --attributes-only
최소한 Precise에서 대상 파일을 자릅니다. 아래 편집 내용을 참조하세요.
원래의:
--attributes-only
이 상황에서는 GNU cp의 옵션을 와 함께 사용 하기를 원할 것입니다. 이 옵션 --archive
은 시도되고 테스트된 코드이므로 모든 파일 시스템에 구애받지 않는 속성을 수행하고 심볼릭 링크를 따르지 않습니다(그를 따르는 것은 나쁠 수 있습니다!).
cp --archive --attributes-only /source/of/failed/backup/. /destination/
파일과 마찬가지로 cp
확장 속성이 추가됩니다. 소스와 대상 모두 확장 속성이 있는 경우추가하다(먼저 대상의 모든 xattrs를 삭제하는 대신) 소스의 확장된 속성을 대상에 적용합니다. 이는 cp
파일을 기존 트리에 복사하는 경우 동작 방식을 반영하지만 예상한 것과 다를 수도 있습니다.
또한 처음에는 하드 링크를 유지하지 않았지만 rsync
지금은 유지하고 싶다면 다음을 참고하세요.cp
습관당신을 위해 그것을 고쳐주세요; 올바른 옵션을 사용하여 다시 실행하는 것이 가장 좋습니다 rsync
(나의다른 답변) 그리고 인내심을 갖는다.
검색 중에 이 질문을 발견했다면고의로메타데이터/파일 내용을 분리하고 재결합한 다음 살펴보는 것이 좋습니다.메타스토어우분투 저장소에 있습니다.
다음을 추가하도록 편집되었습니다.
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);
}
답변4
로컬 전송에서 소스와 대상이 로컬로 마운트된 파일 시스템에 있으면 rsync
항상 전체 파일 내용을 복사합니다. 이를 방지하려면 다음을 사용할 수 있습니다.
rsync -a --no-whole-file source dest