두 개의 연결된 파일 분할

두 개의 연결된 파일 분할

나는 Afile동등한 작업을 수행했습니다 cat a.gif b.7z > Afile.

Afile원본파일 a.gifb.7z파일 로 분할하는 방법은 무엇인가요 ?

답변1

gif가 끝나고 7z가 시작되는 위치를 파악해야 합니다.

gif 파일의 원래 크기를 모르는 경우 7z문자로 시작하는 파일의 시작 부분을 찾아볼 수 있습니다 7z.

운이 좋다면:

grep -boa 7z Afile

(GNU가 grep비표준 -b( byte 오프셋) 을 구현하거나 준수한다고 가정하면 -o( o일치하는 부분만 출력) -a( a텍스트가 아닌 파일을 포함한 모든 파일)) 다음 중 하나만 반환합니다.

<offset>:7z

<offset>파일의 시작 부분까지 파일의 7z오프셋이 될 줄입니다 .

그런 다음 다음을 사용하여 추출할 수 있습니다.

tail -c +<offset+1> Afile > b.7z
head -c <offset> Afile > a.gif

예를 들어 grep를 반환하는 경우 및 를 1234:7z실행합니다 .tail -c +1235 Afile > b.7zhead -c 1234 > a.gif

여러 개가 반환 되면 grep그 중 하나는 7z 파일의 시작 부분이 되고 나머지는 70x37 0x7a(ASCII 집합 합계 문자 값) 바이트 시퀀스를 포함하는 gif 또는 7z 파일이 됩니다.z

어느 것이 올바른지 확인하려면 올바른 출력 과 유사한 것을 반환해야 하는 tail -c각 출력을 파이프 할 수 있습니다. 아니면 내용을 나열해 보세요 .file -7-zip archive databsdtar tf -

tail -c +<offset+1> Afile | file -
tail -c +<offset+1> Afile | bsdtar tf -

이것binwalk유틸리티를 사용하면 파일 내에서 파일 형식 서명을 찾으려고 시도할 때 프로세스를 자동화할 수 있습니다(일반적으로 펌웨어 이미지에서 정보를 추출하는 데 사용됨).

$ binwalk Afile

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             GIF image data, version "89a", 584 x 137
8570          0x217A          7-zip archive data, version 0.4

이상적으로 @Henrik이 주석에서 지적했듯이 GIF 데이터가 끝나는 위치에 대한 정보를 얻으려면 gif 섹션 메타데이터를 살펴봐야 합니다. ImageMagick identify, GNU extract, perl Image::Infoexiftool이미지 정보를 보고하는 일반적인 도구를 확인했지만 안타깝게도 그 중 어느 것도 해당 정보를 보고하지 않았습니다.

연구를 통해 수동으로 수행 가능GIF 이미지 형식 사양, 또 다른 접근 방식은 이미지 뷰어나 변환기에 연결하여 파일을 구문 분석하는 동안 파일 읽기가 중지되는 위치를 확인하는 것입니다.

giftopnm나는 바로 그 일을 할 수 있게 해주는 고대 netpbm소프트웨어를 발견했습니다 . zsh에서:

zmodload zsh/system
{
  giftopnm > /dev/null
  head -c $(( systell(0) )) < Afile > a.gif
  cat > b.7z
} < Afile

내 테스트에서는 giftopnmpnm으로 변환한 후 gif 파일 끝의 위치가 stdin에 유지됩니다(여기에서는 삭제합니다).

데이터가 끝난 후 gif에 추가 정보가 없다고 가정하면 이는 이상해 보이지 않습니다. 예를 들어, gallery/htmlexpo/bludown.gif유용한 데이터가 끝난 후 무작위로 보이는 212바이트가 있는 libreoffice를 참조하세요.cut.gif~에openjdkmat2일부 Sun Microsystems 저작권 표시(정리되지 않음 ) 를 포함하여 949바이트(파일 크기의 거의 80%)가 추가된 것으로 보입니다.

답변2

AfileStephen의 답변은 매우 완전하며 원본 a.gifb.7z파일 로 다시 분할하는 대체 답변을 제공하지 않습니다 . 제가 여기에 쓴 것은 원본 파일을 하나의 파일로 합치는 다른 방법이므로 원본 파일을 복원하는 것이 훨씬 쉽습니다.

원본 파일을 복구하기 어려운 이유는 원본 파일이 단순한 텍스트 파일이 아니라 모두 바이너리 데이터를 포함하고 있고, 파일마다 바이너리 형식이 다르기 때문입니다. 이 cat유틸리티는 경계 표시를 추가하지 않으므로 결합된 파일을 원본 파일로 쉽게 분리할 수 있습니다. 또한 원본 파일의 소유권과 권한을 기억하지 않으므로 문제의 일부가 아니더라도 유용합니다. 그러나 여러 파일을 단일 파일로 병합하고 단일 파일에서 원본 파일을 추출하는 데 사용할 수 있는 다른 프로그램이 있습니다.

가장 일반적으로 사용되는 유틸리티는 tarzip/ 입니다 unzip. 파일을 결합하고 추출하는 명령의 예는 다음과 같습니다.

# combining z.gif and b.7z into Afile
tar cf Afile a.gif b.7z
zip Afile a.gif b.7z

# recovering (usually called extracting) the original files
tar xf Afile
unzip Afile

zip접미사는 일반적으로 결합된 파일("아카이브 파일"이라고 함)의 이름에 추가되므로 이 .zip명령은 zip Afile a.gif b.7z이라는 이름을 생성합니다 . 또한 결합된 파일에 접미사를 사용하여 이름을 지정하는 것이 Afile.zip관례 입니다 . 꼭 이렇게 할 필요는 없지만. 단지 어떤 파일이 "tar 파일"인지 확인하는 데 도움이 됩니다. 두 유틸리티 모두 아카이브 파일의 데이터 압축과 같은 다른 작업을 수행하는 기능이 있습니다. 압축은 특정 두 파일(이미 압축된 형식임)에는 도움이 되지 않지만 다른 유형의 파일에는 유용할 수 있습니다.tar.tar

따라서 다음에 두 개 이상의 파일을 하나로 병합할 때 더 쉽게 만들 수 있는 제안 사항이 있습니다. 이는 Unix/Linux 세계에서 매우 일반적인 작업이며 및 / tar와 같은 zip보관 유틸리티는 unzip거의 항상 cat.

관련 정보