추가 디스크 공간을 차지하지 않고 파일의 편집된 복사본을 만드는 것이 가능합니까?

추가 디스크 공간을 차지하지 않고 파일의 편집된 복사본을 만드는 것이 가능합니까?

큰 파일이 있는 경우 ln추가 디스크 공간을 차지하지 않고 해당 파일의 "복사본"을 만드는 데 사용할 수 있습니다. 하지만 내가 그걸 원하지 않으면 어떡하지?정밀한문서 사본? 전체 파일을 복사하고 디스크 공간을 두 배로 사용하지 않고 약간의 수정만으로 파일의 새 버전을 생성할 수 있는 방법이 있습니까?

내 동기는 토렌트에서 다운로드한 mp3 파일의 id3 태그를 편집하는 것입니다. 다운로드한 파일을 직접 편집하면 시딩이 엉망이 되기 때문에 원하지 않지만, 일부 id3 태그의 헤더를 편집하기 위해 파일을 복사하고 디스크 공간을 두 배로 사용하고 싶지도 않습니다.

답변1

해당 기능이 내장되어 있지 않은 프로그램을 사용하는 경우,씌우다새로운 정보는 어떻게든 기본 파일을 통해 전달되며 파일을 사용하는 애플리케이션에 투명하게 파일 시스템 수준에서 이 문제를 해결해야 합니다. 여러 버전을 제공하더라도 공간 요구 사항으로 인해 개정 관리 시스템만으로는 충분하지 않습니다.

살펴볼 수 있는 한 가지는 파일을 Btrfs 파일 시스템에 저장하고 원본 파일을 "원본" 스냅샷에 넣은 다음 이 스냅샷을 기반으로 하는 보기에 업데이트된 버전을 넣는 것입니다. 이는 ID3v1 태그(파일의 끝이므로)와 ID3v2 태그가 있는 파일에 대해 잘 작동합니다. 단, 변경을 위해 예약된 공간이 충분하고 MP3 파일을 다시 작성할 필요가 없습니다. 따라서 파일에 의해 변경된 실제 블록만 추가 디스크 공간을 차지합니다.

원본 파일에 추가 파일을 추가하는 경우 cp --reflink src dst나중에 추가되는 모든 파일을 명시적으로 설명해야 합니다. 그런 다음 다운로드는 원본 버전, id3 편집기(예: picard) 및 음악 플레이어와 함께 파생된 보기에서 사용됩니다. 이 보기에서 변경되지 않은(또는 아직 변경되지 않은) 파일은 원본 파일과 똑같아 보입니다.

/data0예(Btrfs 볼륨 on 및 test.mp3file on 으로 시작 /tmp):

/data0$ btrfs subvolume create /data0/mp3org
Create subvolume '/data0/mp3org'
/data0$ cp /tmp/test.mp3 mp3org/
/data0$ btrfs subvolume snapshot /data0/mp3org/ /data0/id3update
Create a snapshot of '/data0/mp3org/' in '/data0/id3update'

이제 파일은 두 디렉토리(및) 모두에서 사용할 수 있습니다 test.mp3.mp3orgid3update

/data0$ ls -l /data0/mp3org
total 7600
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:21 test.mp3
/data0$ ls -l /data0/id3update/
total 7600
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:21 test.mp3

스냅샷의 항목을 변경합니다.

/data0$ id3v2 -c "This is a change" id3update/test.mp3
/data0$ ls -l /data0/mp3org
total 7600
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:21 test.mp3
/data0$ ls -l /data0/id3update/
total 7608
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:24 test.mp3

파일 크기는 변경되지 않았지만 두 번째 파일의 내용은 변경되었습니다. 이는 주석이 원본 파일의 예약된 공간인 id3v2에 맞기 때문입니다.

/data0$  grep -F "is a change" mp3org/* id3update/*
Binary file id3update/test.mp3 matches

원본 하위 볼륨에서 다른 파일을 복사하면 다음 위치에 표시되지 않습니다 id3update.

/data0$ cp /tmp/test.mp3 mp3org/abc.mp3
/data0$ ls -l mp3org/ id3update/
id3update/:
total 7600
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:24 test.mp3

mp3org/:
total 15200
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:28 abc.mp3
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:21 test.mp3

참조 링크의 명시적 사본을 만드십시오.

/data0$ cp --reflink mp3org/abc.mp3 id3update/
/data0$ ls -l mp3org/ id3update/
id3update/:
total 15200
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:29 abc.mp3
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:24 test.mp3

mp3org/:
total 15200
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:28 abc.mp3
-rw-rw-r-- 1 avanderneut users 7781043 Oct 25 15:21 test.mp3

새 파일을 변경하십시오.

/data0$ id3v2 -c "another file change" id3update/abc.mp3
/data0$ grep -F change mp3org/* id3update/*
Binary file id3update/abc.mp3 matches
Binary file id3update/test.mp3 matches

자동으로 채워지는 경우 대상이 아직 존재하지 않는 경우 이를 수행하는 스크립트를 주기적으로 실행하여 최신 상태로 유지할 mp3org수 있습니다 .id3updatecp --reflink src dst

¹가장 자주 파일 시작 부분에 나타납니다.

답변2

버전 제어 시스템(예: git)을 사용하면 원하는 수의 파일 버전을 "체크인"하거나 "커밋"할 수 있습니다. Git은 별도의 서버를 사용할 필요가 없고 모든 작업을 로컬 컴퓨터에서 수행할 수 있으며 웹에서 풍부한 튜토리얼 정보를 이용할 수 있기 때문에 아마도 마스터하기 가장 쉬운 버전 제어 시스템 중 하나일 것입니다. 다양한 그래픽 프런트 엔드도 사용할 수 있습니다. Git은 원본 파일의 압축 버전과 버전 간의 차이점으로 다양한 파일 버전을 내부적으로 저장합니다. 제출 프로세스의 일부로 제출된 파일의 상태를 간략하게 설명하는 메시지를 제공한 다음 사용 가능한 버전을 찾아보고 현재 사용하려는 버전을 "체크아웃"할 수 있습니다.

답변3

diff차이점을 찾으려면 파일을 한 줄씩 비교하는 명령이 있습니다 . 원본 파일에 차이 파일을 적용 하면 차이를 저장 diff-file하고 언제든지 적용 할 수 있습니다. patch그러나 어쨌든 변경 사항을 적용하려면 먼저 두 번째 파일을 만들어야 합니다(diff 파일을 받은 후 삭제할 수 있습니다).

diff인수가 있어도 바이너리를 사용할 수 없는 경우 --text자유롭게 사용할 수 있습니다 bsdiff.rdiff앙케의견을 위해).

관련 정보