파일의 실제 내용없이 파일 속성 (메타 데이터) 만 복사하는 방법은 무엇입니까?


21

이미 테라 바이트 크기의 파일을 복사 rsync했지만 --archive파일의 특수 속성을 보존하는 데 사용 하는 것을 잊었습니다 .

rsync이번에는 다시 실행을 시도했지만 --archive예상보다 느립니다. 메타 데이터를 재귀 적으로 복사하여이 작업을 더 빠르게 수행 할 수있는 쉬운 방법이 있습니까?


"메타 데이터"란 파일 권한과 파일 소유권 또는 확장 된 파일 속성과 같은 더 복잡한 것을 의미합니까?
Marcel Stimberg

소스 파일이있는 파일 시스템이 로컬로 마운트되어 있습니까?
enzotib

메타 데이터로 권한과 타임 스탬프를 의미합니다. 타임 스탬프는 특히 중요합니다.
Mohammad

소스 및 대상의 filsystem이 로컬로 마운트됩니다.
Mohammad

답변:


17

좋아, 당신은 사용하여 소유자, 그룹, 권한 및 타임 스탬프를 복사 할 수 있습니다 --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

sudochown을 허용하고 source 및 destination 디렉토리의 두 매개 변수를 사용 하여 실행해야합니다 . 스크립트는 수행 할 작업 만 에코합니다. 만족하면로 줄 myecho=echo을 변경하십시오 myecho=.


1
그렇습니다. 이것이 chmod의 --reference입니다. 고맙습니다. 그리고 누군가가 타임 스탬프 복사를위한 참조 인 chmod와 같은 것을 소개 할 수 있다면 정말 감사합니다.
Mohammad

1
@Mohammad : 사용할 수 있습니다 touch --reference=otherfile file. 답변 업데이트
enzotib

훌륭합니다. 실제로 나는 지금 막 터치 매뉴얼을 읽고 있었다 ;-)
Mohammad

참고 사항 : touch설계에 따라 수정 및 액세스 시간 만 변경되므로 "작성"시간은 영향을받지 않습니다. (ext2 / 3는 ctime 변경을 지원하지 않지만 NTFS 등을 사용하는 경우 중요 할 수 있다고 생각합니다).
Amro

기존 파일의 메타 데이터 만 변경 하고 파일의 존재를 보장 할 필요가없는 -c경우 touch명령에 스위치를 추가하여 파일에서 빈 파일 생성을 중지하십시오 $dst_path.
Synchro

5

경고 : 특별한 해결 방법이 없으면 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 매뉴얼


추가하기 위해 편집 :

cpGNU 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합니까?
enzotib

그것을 제거하는 빠른 테스트는 효과가있는 것 같습니다. 그래서 원래 의 중복 / 실수를 영속 시켰지만 이제는 누구나 새로운 코어 유틸리티를 사용하게 될 것입니다.
ZakW

그러나 rsync올바른 옵션으로 부르는 것은 또 다른 질문에 대한 답변입니다.
Jean Paul

5

질문을 "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 ..., 간결하고 세부적인 내용을 알려줍니다.


1
매우 유용한 정보. --archive --size-only는 훌륭한 콤보입니다. 대상에 이미 존재하는 파일을 다시 복사하지 못하게 할뿐만 아니라 메타 데이터도 업데이트합니다. rsync의 매뉴얼 페이지는 --size-only를 크기가 일치하는 "건너 뛰기"파일로 설명하기 때문에 예상치 못한 결과였습니다. 복사본을 건너 뛰지 만 여전히 메타 데이터를 동기화합니다. 이상.
차드 폰 나우

2

로컬 전송에서 소스와 대상이 로컬로 마운트 된 파일 시스템에 있으면 rsync항상 전체 파일 내용을 복사합니다. 이것을 피하기 위해 사용할 수 있습니다

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

--no-whole-file 및 --progress로 rsync를 시도했지만 여전히 복사 진행률 (약 30MB / s)을 볼 수 있습니다. 아직 빠르지 않은 것 같습니다. 나는 rsync에 대한 희망을 잃고 ...
Mohammad

이 옵션은 rsync파일이 모두 로컬 경로에있을 때 바로 가기를 사용하지 않도록 지시하는 데 사용 되지만 rsync내용을 복사 하지 못하게하지는 않습니다 .
장 폴

1

다른 컴퓨터에서 원격 으로이 작업을 수행하여 사용할 수 없었습니다.

나는 이것을 스크립트를 만들기 위해 사용했다 ...

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

그러나 먼저 파일 이름에 "가있는 파일 이름이 없는지 확인하십시오.

find | grep '"'

그런 다음 touch.sh를 원격 컴퓨터에 복사하고 실행하십시오.

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

find -printf에는 복사 할 사용자, 그룹 이름을 인쇄하는 옵션도 있습니다.


a) "쉘 스크립트 만 사용"및 b)를 사용하여 해당 스크립트를 생성하는 아이디어에 감사드립니다 find. 나는 같은 상황에 있었다-속성, 소스 및 대상 디스크를 이미 다른 기계에 복사하는 것을 잊어 버렸고 실제로 그것을 바꾸고 싶지 않았습니다 .
i336_
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.