여분의 디스크 공간이 거의없는 두 개의 거대한 파일을 어떻게 연결할 수 있습니까? [닫은

StackOverflow https://stackoverflow.com/questions/290700

문제

함께 연결하려는 두 개의 거대한 파일 (여러 GB)이 있지만 여분의 디스크 공간이 거의 없다고 가정 해 봅시다 (수백 MB라고 가정 해 봅시다). 즉, 주어진 것입니다 file1 그리고 file2, 당신은 단일 파일로 끝나고 싶습니다. file1 그리고 file2 바이트로 바이트를 함께하고 원본 파일을 삭제하십시오.

당신은 명백한 일을 할 수 없습니다 cat file2 >> file1; rm file2, 두 작업 사이에 디스크 공간이 부족합니다.

무료 또는 비없는 도구가있는 모든 플랫폼에 대한 솔루션을 환영합니다. 이것은 다른 날 Linux ISO를 다운로드하는 동안 생각한 가상의 문제이며, 무선 딸꾹질로 인해 다운로드가 중단되었습니다.

도움이 되었습니까?

해결책

어려움은 원본 파일에서 공간을 어떻게 복구 할 수 있는지 결정하는 것입니다.

나는 다음이 효과가 있다고 생각합니다.

  1. 결합 된 크기의 희소 파일을 할당하십시오.
  2. 두 번째 파일 끝에서 새 파일 끝까지 100MB를 복사하십시오.
  3. 두 번째 파일의 끝에서 100MB를 잘라냅니다
  4. 두 번째 파일을 완료 할 때까지 루프 2 & 3 (2. 대상 파일의 올바른 위치로 수정).
  5. 2 & 3 & 4를 수행하지만 첫 번째 파일로 수행하십시오.

이것은 모두 희소 파일 지원에 의존하고 파일 절단 공간을 즉시 파일로 제공합니다.

실제로 이것을하고 싶다면 dd 명령. 복사 단계를 수행 할 수 있습니다

다른 답변에있는 누군가가 드문 파일이 필요하지 않지만 파일 2를 두 번 복사하는 깔끔한 솔루션을 제공했습니다.

  1. 파일 2의 끝에서 새로운 파일 3으로 100MB 청크를 복사하여 역 순서로 끝납니다. 갈 때 파일 2를 잘라냅니다.
  2. 파일 3의 끝에서 파일 1에 100MB 청크를 복사하여 파일의 끝에서 원래 순서로 청크로 끝납니다.

다른 팁

디스크 부문 셔플 링 및 파일 체인 조작과 관련된 영리한 솔루션을 알아내는 데 소요되는 시간 : 2-4 시간

현장 사본 및 자리를 수행하기 위해 소프트웨어를 획득/작성하는 데 소요되는 시간 : 2-20 시간

시간 중앙값 $ 50/HR 프로그래머 요금 : $ 400- $ 1200

1TB USB 드라이브 비용 : $ 100- $ 200

"기회 비용"이라는 문구를 이해하는 능력 : 귀중한

다음은 저의 약간의 개선입니다 첫 번째 답변.

100MB가없는 경우 두 번째 파일에서 마지막 100MB를 복사하고 세 번째 파일을 만듭니다. 두 번째 파일을 잘라서 이제는 100MB 더 작습니다. 두 번째 파일이 개별 100MB 청크로 완전히 분해 될 때 까지이 프로세스를 반복하십시오.

이제이 100MB 파일 각각은 첫 번째 파일, 한 번에 하나씩 추가 할 수 있습니다.

이러한 제약 조건으로 파일 시스템을 조작해야한다고 기대합니다. 파일 크기 및 할당 블록을 직접 편집합니다.

다시 말해, 파일 컨텐츠 블록을 뒤섞는 것을 잊고 해당 파일에 대한 정보를 편집하기 만하면됩니다.

파일이 압축성이 높은 경우 (예 : 로그) :

gzip file1

gzip file2

zcat file1 file2 | gzip > file3

rm file1

rm file2

gunzip file3

Flippant 소리가 들릴 위험이 높아지면 더 큰 디스크를 얻는 옵션을 고려 했습니까? 아마도 더 빠를 것입니다 ...

그다지 효율적이지는 않지만 수행 할 수 있다고 생각합니다.

Append 모드에서 첫 번째 파일을 열고 디스크가 거의 가득 찰 때까지 두 번째 파일에서 블록을 복사하십시오. 두 번째 파일의 나머지 경우, 임의의 액세스 I/O를 통해 파일의 시작으로 다시 중지 한 지점에서 블록을 복사합니다. 마지막 블록을 복사 한 후 파일을 자릅니다. 끝날 때까지 반복하십시오.

분명히, 경제적 답변은 가능한 대답이라고 가정하면 더 많은 스토리지를 구매하는 것입니다. 그러나 더 많은 스토리지를 부착 할 수있는 방법이 없거나 장비 자체에 액세스 할 수없는 공간 프로브 (비행 중에는 우주 프로브)가 없을 수도 있습니다.

스파 스 파일 시스템을 기반으로 한 이전에 제시된 답변은 (잘못되면 파괴적인 특성을 제외하고는)입니다. 그래도 그렇지 않으면 어떻게됩니까?

파일 끝에서 2 개의 복사 블록에서 시작하여 대상 파일의 시작까지 시작합니다. 각 블록 후에는 소스 파일을 보이지 않는 길이로 자릅니다. 파일 #1에 대해 반복하십시오.

이 시점에서 대상 파일에는 모든 데이터가 거꾸로 포함되며 소스 파일이 사라집니다.

타르트에서 블록과 대상 파일의 끝에서 블록을 읽고 반대하여 다른 사람이 온 지점에 씁니다. 뒤집는 블록을 안쪽으로 향하게하십시오.

완료되면 대상 파일은 소스 파일의 연결입니다. 드문 파일 시스템이 필요하지 않으며, 파일 시스템이 필요하지 않습니다. 데이터는 메모리에서 유지 될 수 있으므로 제로 바이트로 수행 할 수 있습니다.

좋아, 이론적 인 엔터테인먼트를 위해, 그리고 당신이 실제로 시간을 낭비하지 않겠다고 약속하는 경우에만.

  • 파일은 디스크에 조각으로 저장됩니다
  • 조각은 체인으로 연결되어 있습니다

따라서 파일을 연결할 수 있습니다.

  • 첫 번째 파일의 마지막 부분을 마지막 파일의 첫 번째 부분에 연결
  • 마지막 조각과 파일 크기를 변경하려면 첫 번째 파일에 대한 디렉토리 항목 변경
  • 마지막 파일의 디렉토리 항목 제거
  • 첫 번째 파일의 파일 끝 마커 정리
  • 첫 번째 파일의 마지막 세그먼트가 부분적으로 만 채워지면 파일 중간에 쓰레기가없는 것을 피하기 위해 마지막 파일의 세그먼트를 "위로"복사해야합니다.

최소화, 최소 복사, 여분의 디스크 공간이 필요하지 않습니다.

이제 USB 드라이브를 사러 가십시오 ;-)

두 가지 생각 :

물리적 RAM이 충분하다면 실제로 두 번째 파일을 완전히 메모리에 전적으로 읽고 삭제 한 다음 첫 번째 파일에 추가 모드로 쓸 수 있습니다. 물론 삭제 후 전원이 손실되지만 쓰기를 완료하기 전에 두 번째 파일의 일부를 잃어 버렸다면 좋은 일입니다.

OS 기능에 사용되는 디스크 공간 (예 : 가상 메모리, "재활용 빈"또는 이와 유사)에 사용되는 디스크 공간을 일시적으로 줄입니다. 아마도 창에서만 사용됩니다.

나는 이것이 질문에 대한 직접적인 대답이라고 의심합니다. 이것을 문제를 해결하기위한 대안적인 방법으로 간주 할 수 있습니다.

두 번째 파일을 첫 번째 파일의 파트 2로 고려할 수 있다고 생각합니다. 일반적으로 zip 응용 프로그램에서는 거대한 파일이 여러 부분으로 분할됩니다. 첫 번째 부분을 열면 응용 프로그램은 추가 처리에서 다른 부분을 자동으로 고려합니다.

우리는 여기에서 같은 것을 시뮬레이션 할 수 있습니다. @edg가 지적했듯이, 파일 시스템을 한 가지 방법 일 것입니다.

당신은 이것을 할 수 있습니다 :

head file2 --bytes=1024 >> file1 && tail --bytes=+1024 file2 >file2 

당신은 당신이 가지고있는 여분의 디스크 공간에 따라 1024를 늘릴 수 있으며, 모든 바이트가 움직일 때까지 이것을 반복하십시오.

이것은 아마도 그것을하는 가장 빠른 방법 일 것입니다 (개발 시간 측면에서)

전체 파일 시스템을 압축하여 공간을 확보 할 수 있습니다. 나는 NTFS가 이것을 뒷받침한다고 생각하며, 그것을 지원할 *nix 파일 시스템의 풍미가 있다고 확신합니다. 또한 파일을 복사 한 후 시작했을 때보 다 더 많은 디스크 공간이 남아있을 것입니다.

좋아, 문제를 조금 바꾸십시오. 디스크에 필요하지 않은 다른 것들이있을 가능성이 있지만 그것이 무엇인지 또는 어디에 있는지 모릅니다. 당신이 그것을 찾을 수 있다면, 당신은 그것을 삭제할 수 있고, 아마도 여분의 공간이 충분할 것입니다.

몇 가지 큰 것, 또는 작은 것들에 관계없이 이러한 "종양"을 찾으려면 약간의 샘플링 프로그램을 사용합니다. 디렉토리 상단 (또는 루트)에서 두 번 패스를 만듭니다. Pass 1에서는 디렉토리 트리를 걸어 모든 파일의 크기를 추가하여 총 n 바이트를 얻습니다. Pass 2에서는 디렉토리 트리를 다시 걸어 모든 파일을 읽는 척합니다. N/20 바이트를 통과 할 때마다 디렉토리 경로와 "읽기"파일의 이름을 인쇄합니다. 따라서 최종 결과는 20 개의 깊은 경로 이름이 디렉토리 아래의 모든 바이트에 균일하게 퍼져 있습니다.

그런 다음 필요하지 않은 것들이 많이 나타나는 물건에 대한 목록을보고 날려 버리십시오.

(성능 최적화에 사용하는 샘플링 방법의 공간과 동등한 일입니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top