rsync: 심볼릭 링크를 일반 파일로 복사

rsync: 심볼릭 링크를 일반 파일로 복사

이미 중요한 데이터가 많이 들어 있는 드라이브에 다양한 파일이 들어 있는 대용량 디렉터리를 복사해야 합니다.

제거된 심볼릭 링크를 복사하고 싶지만 드라이브가 exfat이고 심볼릭 링크를 지원하지 않습니다. 파일에는 이미 많은 데이터가 포함되어 있으므로 해당 데이터를 심볼릭 링크를 지원하는 형식으로 포맷하기 위해 전송할 필요가 없습니다.

rsync를 사용하여 다음과 같은 심볼릭 링크를 읽는 방법이 있습니까?

/etc/apache2/sites-enabled/mysite.conf -> ../sites-available/mysite.conf

다음과 같은 일반 파일을 생성합니다.

<rsync-destination>/etc/apache2/sites-enabled/mysite.conf.rsync-munged

텍스트를 포함합니다

../sites-available/mysite.conf

나는 rsync에 내장되었거나 bash 파이프라인에서 수행되는 솔루션, 또는 최소한 Linux에 있는 기본 도구의 일부를 선호하지만 rsync 기능 + 이 기능을 제공하는 다른 소프트웨어에도 개방적입니다.

편집하다:

나는 rsync가 그런 일을 할 수 없다는 것을 알았습니다. 이 작업을 수동으로 수행하는 방법을 찾은 것 같습니다.

심볼릭 링크를 제외한 모든 것을 rsync한 다음 별도의 찾기 작업을 실행하여 소스의 모든 심볼릭 링크를 식별하고 bash 스크립트를 사용하여 수동으로 생성합니다.

stdio에서 심볼릭 링크 데이터를 수동으로 추출해야 하는데 어떻게 해야 할지 모르겠습니다. ls -l 더 많은 데이터가 있으면 방해가 됩니다.

답변1

원하는 것은 직접적으로 가능하지 않습니다.

  • 심볼릭 링크를 접미사 이름이 있는 파일로 변환할 수 없습니다.munged
  • 심볼릭 링크를 일반 파일( )로 변환할 수 있지만 --fake-super이와 관련된 메타데이터(심볼릭 링크로 다시 변환 가능)는 exFAT 파일 시스템에 저장할 수 없습니다.

다른 가능성

  • --munge-links옵션은 기호 링크를 기호 링크로 유지하지만 기호 링크의 값을 수정하여 대상 시스템에서 유효하지 않게 합니다. exFAT 파일 시스템에는 유용하지 않음
  • --copy-links를 사용하여 심볼릭 링크를 실제 파일로 확장 할 수 있습니다 . 이는 심볼릭 링크 정보가 손실되고 데이터가 소스 시스템으로 반환될 때 재구성될 수 없기 때문에 원하는 것이 아닐 수 있습니다.

내가 볼 수 있는 유일한 다른 해결책은 기본 Linux 파일 시스템으로 마운트할 수 있는 큰 파일을 대상 시스템에 생성하는 것입니다. 그런 ext4다음 해당 파일 시스템으로 백업을 보내고 exFAT 이상의 추가 기능을 활용할 수 있습니다. 세트.

답변2

rsync 일반 파일을 만든 다음 모든 링크를 개별적으로 찾아서 하나의 파일에 나열한 다음 모든 링크 파일을 하나씩 만듭니다.

#!/bin/bash
$SRCDIR="/backup/";
$SRCSERVER="[email protected]";
$DEST=".";
rsync -rtpEv "$SRCSERVER:$SRCDEST" $DEST;
ssh SRCSERVER "stat -c %N \`find $SRCDIR -type l\` 2> /dev/null" > links;
$MUNGED = ".munged";

while read p; do                                                                                                                                                                                                     
    file=$(echo $p | awk -F ' ' '{print $1}' | sed "s/^\`/;s/'$//");                                                                                                                                                  
    dest=$(echo $p | awk -F ' ' '{print $3}' | sed "s/^\`//;s/'$//");                                                                                                                                                  
    echo $dest > "$file$MUNGED";
done < links;                                                                                                                                                                                      

(내 bash 구문이 확실하지 않아서 기본적으로 이 모든 작업을 수동으로 실행했습니다)

답변3

파일을 직접 읽거나 수정할 필요가 없고 전체만 복원할 수 있는 경우 간단한 해결 방법은 해당 파일을 보관하는 것입니다 tar.


백업에서 직접 파일을 읽을 필요는 없지만 백업을 업데이트하고 싶고 디스크에 여유 공간이 있는 경우 다음을 사용할 수 있습니다.자식데이터를 보관합니다. 보너스로 이전 버전을 복원할 수 있습니다.

cd /path/to/back/up
git init .
git commit -a
git clone --bare .git /media/external-disk/my-site.git

Git은 심볼릭 링크를 저장하지만 권한은 저장하지 않습니다. 파일의 권한이 중요한 경우 다음을 사용할 수 있습니다.관리자를 기다려주세요. Git(또는 기타 버전 제어 시스템)을 중심으로 돌아가며 파일 메타데이터를 별도의 파일에 저장합니다.


Linux가 아닌 시스템에서 이러한 파일에 액세스할 필요가 없고 전체 크기를 정확하게 추정할 수 있는 경우 ext4 파일 시스템 이미지를 생성하고루프 설치그것. 사전 준비 작업은 다음과 같습니다.

truncate -s 42G /media/external-disk/linux.fs
mkfs.ext4 -F /media/external-disk/linux.fs

그런 다음 파일 시스템 이미지를 사용하십시오.

sudo mkdir /media/external-linux
sudo mount -o loop /media/external-disk/linux.fs /media/external-linux
sudo rsync -ax / /media/external-linux/my-site-backup
sudo umount /media/external-linux

한 가지 가능한 접근 방식은 파일 시스템 계층에서 별도의 파일을 사용하여 기본 파일 시스템에서 지원하지 않는 메타데이터를 저장하는 것입니다. [Upfs](시도해 볼 수 있습니다UPFS, 실제로 그렇습니다. 그러나 불행히도 유지되지 않습니다.

(아주 아주 오래전에,움스토스매우 인기가 높습니다. 기호 링크, 권한, 8자보다 긴 파일 이름과 3자 확장자 등을 지원하지 않는 FAT 파일 시스템에 Linux 파일을 저장할 수 있습니다. 불행히도 FAT32 또는 exFat과 호환되지 않습니다. )

관련 정보