파일을 분할한 후 다시 병합하는 가장 좋은 방법은 무엇입니까?

파일을 분할한 후 다시 병합하는 가장 좋은 방법은 무엇입니까?

큰 파일이 있고 이를 100MB 청크로 분할해야 하는 경우 이렇게 합니다.

split -b 100m myImage.iso

이것은 보통 나에게 다음과 같은 것을 제공합니다

xaa
xab
xac
xad

다시 합치기 위해 나는 사용해 왔습니다.

cat x* > myImage.iso

파일 집합의 모든 코드 줄을 읽고 출력을 새 파일로 리디렉션하는 것보다 cat더 효율적인 방법이 있어야 할 것 같습니다. 두 개의 파일을 여는 것과 마찬가지로 EOF첫 번째 파일에서 태그를 제거하고 연결합니다. 모든 항목을 탐색할 필요가 없습니다.

Windows/DOS에는 바이너리 파일에 대한 복사 명령이 있습니다. 도움말에는 이 명령이 여러 파일을 병합할 수 있도록 설계되었다고 언급되어 있습니다. 다음 구문을 사용합니다. ( /b바이너리 모드의 경우)

copy /b file1 + file2 + file3 outputfile

Linux에서 대용량 파일을 연결하는 데 cat과 유사하거나 더 좋은 방법이 있습니까?

고쳐 쓰다

cat실제로 이것이 파일을 연결하는 가장 정확하고 최선의 방법인 것 같습니다 . 올바른 명령을 사용하고 있어서 다행입니다. :) 피드백을 보내주신 모든 분들께 감사드립니다.

답변1

그게 다야cat예. 가장 오래된 GNU 도구 중 하나이기 때문에 다른 도구가 이 작업을 더 빠르고 더 잘 수행할 가능성은 거의 없다고 생각합니다. 이것은 아니다관로- 출력을 리디렉션할 뿐입니다.

답변2

후드

첫 번째 파일을 복사한 다음 그 뒤의 두 번째 파일을 복사하는 것보다 더 효율적인 방법은 없습니다. DOS는 이것을 할 copy수 있습니다 .cat

각 파일은 디스크의 다른 파일과 독립적으로 저장됩니다. 디스크와 같은 장치에 데이터를 저장하도록 설계된 거의 모든 파일 시스템은 블록으로 작동합니다. 다음은 무슨 일이 일어나는지에 대한 매우 단순화된 데모입니다. 디스크는 1kB 블록으로 나누어지고 운영 체제는 각 파일에 대해 파일을 구성하는 블록 목록을 저장합니다. 대부분의 파일은 정수가 아닌 블록 길이를 가지므로 마지막 블록은 부분적으로만 채워집니다. 실제로 여러 파일 간에 마지막 부분 블록을 공유하거나 "블록 46798, 블록 46799..." 대신 "블록 46798 ~ 47913"을 저장하는 등 파일 시스템에 대한 최적화가 많이 있습니다. 운영 체제는 새 파일을 생성해야 할 때 사용 가능한 블록을 찾습니다. 블록이 연속적일 필요는 없습니다. 블록 4, 5, 98 및 178만 비어 있으면 4kB 파일을 저장할 수 있습니다. 바이트 수준으로 드릴다운하는 대신 블록을 사용하면 새 파일이나 증가하는 파일에 대해 사용 가능한 블록을 더 빠르게 찾는 데 도움이 되며 대용량 파일을 생성하거나 늘리거나 삭제하거나 축소할 때 조각화로 인한 문제를 줄일 수 있습니다(여러 파일 뒤에 더 많은 파일이 남음).

파일 중간에 부분 블록을 지원할 수 있지만 이는 특히 파일을 비순차적으로 액세스할 때 상당한 복잡성을 추가합니다. 10340번째 바이트로 점프하려면 더 이상 11번째 블록 100바이트로 점프할 수 없습니다. 각 중간 블록의 길이.

청크 사용을 고려할 때 일반적으로 첫 번째 파일이 청크 중간에 끝나기 때문에 두 파일을 단순히 연결할 수는 없습니다. 물론 특별한 경우가 있을 수 있지만 연결하는 동안 두 파일을 모두 삭제하려는 경우에만 해당됩니다. 이는 드문 작업에 대한 매우 구체적인 처리입니다. 일반적인 파일 시스템에서는 많은 파일이 동시에 액세스되기 때문에 이 특수 처리는 그 자체로 존재하지 않습니다. 따라서 최적화를 추가하려면 신중하게 생각해야 합니다. 다른 프로세스가 관련 파일 중 하나를 읽고 있으면 어떻게 될까요? A와 C가 연결된 상태에서 누군가 A와 B를 연결하려고 하면 어떻게 되나요? 등. 전체적으로 이 드문 최적화는 큰 부담이 될 것입니다.

대체로 다른 곳에서 상당한 희생을 치르지 않고는 파일 연결을 더 효율적으로 만들 수 없습니다. 그것은 가치가 없어.

분할 및 병합 정보

splitcat파일을 분할하고 병합하는 쉬운 방법입니다 . 연결에 split적합한 알파벳순으로 이름이 지정된 파일을 생성하는 역할을 담당합니다 .cat *

조인의 한 가지 단점 cat은 일반적인 실패 모드에 강력하지 않다는 것입니다. 파일 중 하나가 잘리거나 없어도 cat불평하지 않고 손상된 출력만 받게 됩니다.

zipsplit및 와 같은 다중 부분 아카이브를 생성할 수 있는 압축 유틸리티가 있습니다 rar -v. 분할 외에도 압축 및 압축(여러 파일을 단일 파일로 조립)도 수행하므로 매우 균일하지 않습니다. 반대로 연결 외에도 압축 풀기 및 압축 풀기도 수행합니다. 그러나 모든 부품이 있고 부품이 완전하다는 것을 확인하므로 유용합니다.

답변3

시스템 /pipe를 통해 stdin모든 것을 파이프하는 것보다 더 효율적인 방법이 있어야 할 것 같습니다.stdout

그러나 그것은 진실이 아니다. 연결되는 쉘의 표준 출력cat 곧장열린 파일에 저장합니다. 이는 "stdout을 통해"를 의미하며 디스크에 쓰는 것과 같습니다.

답변4

한때 이런 문제가 있었습니다. 일부 파일을 결합하고 싶었지만 해당 파일을 수용할 디스크 공간이 충분하지 않았습니다.

그래서 저는 여러 가지 프로그램을 작성했습니다.

  • 하나는 파일을 읽고 표준 출력으로 보내고, 완료되면 삭제하여 파일을 "흡수"하는 것입니다.
  • 하나는 데이터의 "동적" 버퍼링을 위한 것입니다.

이를 통해 다음과 같은 작업을 수행할 수 있습니다.

partto sourcefile | mybuffer 128M >>cumufile

따라서 128M이 작성되지 않은 동안 소스 파일을 삭제합니다. 약간 위험하지만 데이터가 그다지 귀중하지 않거나 다른 곳에도 존재하는 경우에는 가능합니다.

필요한 경우 소스 코드를 제공할 수 있습니다.

관련 정보