무대를 마련하다

무대를 마련하다

CentOS 터미널에서 다중 부분 7z 파일(doc.7z.001, doc.7z.002...., doc.7z.060)을 추출하는 방법은 무엇입니까? 다음 명령을 사용하여 모든 부분을 하나의 파일로 연결해 보았습니다.

cat doc.7z* > ./docs.7z

이 명령을 사용하여 파일을 추출하고,

7za x docs.7z

이로 인해이 오류가 발생했습니다.

    Scanning the drive for archives: 1 file, 32937135758 bytes (31 GiB)

Extracting archive: docs.7z ERROR: docs.7z docs.7z Open ERROR: Can not open the file as [7z] archive


ERRORS: Unexpected end of archive
     Can't open as archive: 1 Files: 0 Size:       0 Compressed: 0

답변1

무대를 마련하다

먼저 입력 파일을 만들어 보겠습니다.

$ dd if=/dev/random of=in bs=512 count=10
10+0 records in
10+0 records out
5120 bytes (5.1 kB, 5.0 KiB) copied, 0.00056488 s, 9.1 MB/s

카탈로그에는 무엇이 있나요?

$ ls -l
total 8
-rw-r----- 1 tomasz tomasz 5120 Jul 31 18:37 in

이제 멀티파트 아카이브를 구축해 보겠습니다.

$ 7z a -v1k arch in

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=en_GB.UTF-8,Utf16=on,HugeFiles=on,64 bits,2 CPUs Intel(R) Core(TM)2 Duo CPU     U9400  @ 1.40GHz (1067A),ASM)

Scanning the drive:
1 file, 5120 bytes (5 KiB)

Creating archive: arch.7z

Items to compress: 1

    
Files read from disk: 1
Archive size: 5238 bytes (6 KiB)
Everything is Ok

결과?

$ ls
arch.7z.001  arch.7z.002  arch.7z.003  arch.7z.004  arch.7z.005  arch.7z.006  in

이제 기존 입력 파일을 다른 곳으로 옮겨 보겠습니다.

$ mv in in.o && ls
arch.7z.001  arch.7z.002  arch.7z.003  arch.7z.004  arch.7z.005  arch.7z.006  in.o

솔루션 1

이제 파일을 다시 추출할 차례입니다.

$ 7z e -ai'!arch.*' -an

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=en_GB.UTF-8,Utf16=on,HugeFiles=on,64 bits,2 CPUs Intel(R) Core(TM)2 Duo CPU     U9400  @ 1.40GHz (1067A),ASM)

Scanning the drive for archives:
6 files, 5238 bytes (6 KiB)
    
Extracting archive: arch.7z.001
--
Path = arch.7z.001
Type = Split
Physical Size = 1024
Volumes = 6
Total Physical Size = 5238
----
Path = arch.7z
Size = 5238
--
Path = arch.7z
Type = 7z
Physical Size = 5238
Headers Size = 114
Method = LZMA2:6k
Solid = -
Blocks = 1

Everything is Ok
      
Size:       5120
Compressed: 5238

지금 우리가 가지고 있는 것이 무엇인지 보세요.

$ ls
arch.7z.001  arch.7z.002  arch.7z.003  arch.7z.004  arch.7z.005  arch.7z.006  in  in.o

그래서 in파일이 돌아왔습니다. 와 같은가요 in.o?

$ diff in in.o && echo same
same

출력이 충분하지 않습니다 diff.

설명하다

조치과정은 이렇습니다.

7z e -ai'!arch.*' -an

전체 명령은 다음 요소로 구성됩니다.

  • 7z기본 명령어 입니다
  • e추출을 나타냅니다.
  • -ai포함할 파일을 선택합니다. 이 옵션은 7z 버전 전반에 걸쳐 표준적인 것으로 보입니다. 아니면 컴파일된 표준일 수도 있지만 확실하지 않습니다. 그러나 다음과 같은 온라인에서 찾을 수 있습니다.여기. 이에 대한 구문은 입니다 -ai[r[-|0]]{@listfile|!wildcard}. 제가 사용하고 있는 옵션만 설명하겠습니다. 다른 것들은 문서의 도움을 받아 명확히 할 수 있습니다. 나는 !wildcard일반적인 와일드카드 패턴을 따르는 것으로 보이는 this 를 사용하고 있지만 초기 패턴에는 !이 선택 항목이 도입되었습니다.
  • -an내 시스템에서는 다음과 같이 정의됩니다. -an : disable archive_name field인기 있는 온라인 문서에서는 실제로 이와 같은 내용을 찾을 수 없습니다.이것. 다시 말하지만, 컴파일되었거나 버전별로 다릅니다. 공통 명령 구문이 완화되므로 논리가 더 명확해집니다. 이에 대한 자세한 내용은 아래에서 확인하세요.

명령은 다음과 같습니다.

7z <command> [<switches>... ] <archive_name> [<file_names>... ] [<@listfiles>... ]

[이 표기법의 아카이브 이름은 및 로 표시된 매개변수와 달리 필수입니다 ]. 그것이 하는 일은 -an그 의무를 제거하는 것입니다.

사용하지 않을 경우 7z결과는 다음과 같습니다.

$ 7z e -ai'!arch.*'

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=en_GB.UTF-8,Utf16=on,HugeFiles=on,64 bits,2 CPUs Intel(R) Core(TM)2 Duo CPU     U9400  @ 1.40GHz (1067A),ASM)



Command Line Error:
Cannot find archive name

그러나 간단히 다음을 사용하여 협상할 수 있습니다.어느필수 매개변수로 이름을 지정합니다. 어쨌든 필터링됩니다.

디렉터리에 무엇이 있는지 다시 확인하세요.

$ ls
arch.7z.001  arch.7z.002  arch.7z.003  arch.7z.004  arch.7z.005  arch.7z.006  in.o

그리고 다음과 같은 작업을 수행할 수 있습니다.

$ 7z e -ai'!arch.*' asdf

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=en_GB.UTF-8,Utf16=on,HugeFiles=on,64 bits,2 CPUs Intel(R) Core(TM)2 Duo CPU     U9400  @ 1.40GHz (1067A),ASM)

Scanning the drive for archives:
6 files, 5238 bytes (6 KiB)
    
Extracting archive: arch.7z.001
--
Path = arch.7z.001
Type = Split
Physical Size = 1024
Volumes = 6
Total Physical Size = 5238
----
Path = arch.7z
Size = 5238
--
Path = arch.7z
Type = 7z
Physical Size = 5238
Headers Size = 114
Method = LZMA2:6k
Solid = -
Blocks = 1

Everything is Ok
      
Size:       5120
Compressed: 5238

디렉터리의 새 상태:

$ ls
arch.7z.001  arch.7z.002  arch.7z.003  arch.7z.004  arch.7z.005  arch.7z.006  in  in.o

그리고 그 결과는 정확해야 합니다.

$ sha224sum in in.o
fde74a72c7f4079db4ca18d96629a4f316cd76324bda9742cb2d6c5c  in
fde74a72c7f4079db4ca18d96629a4f316cd76324bda9742cb2d6c5c  in.o

문서

스위치 -an는 다음과 같이 기록됩니다.데비안 7zz 사람들, 내 Debian Bullseye 파생 7z 및 공식 소스 코드v.22.01다운로드 가능여기.

어떤 경우에는 이 옵션이 문서화되지 않은 구체적인 이유를 -an추적하기 어렵습니다. 내가 찾은 내용에 따르면, 누군가가 문서화하지 않더라도 시도해 볼 가치가 있을 수 있습니다. 그 이유는 p7zip에 대한 문서가 CentOS에서 예상되는 것과 다른 것으로 보이기 때문입니다. man의 소스 코드를 볼 수 있습니다.여기, 이 스위치는 문서화되어 있지 않습니다. 이는 동일한 소스 라이브러리의 다른 여러 위치에서도 언급됩니다. (현재와 동일한 마스터 브랜치입니다.)

$ grep -rPI '\B-an\b'
CPP/7zip/UI/Console/Main.cpp:    "  -an : disable archive_name field\n"
CPP/7zip/UI/P7ZIP/wxP7ZIP.cpp:static LPCWSTR kArchiveNoNameSwitch = L" -an";
CPP/7zip/UI/Common/CompressCall.cpp:static const char *kArcIncludeSwitches = " -an -ai";
CPP/7zip/UI/Common/CompressCall.cpp:    params.AddAscii(" -an");
GUI/p7zipForFilemanager:    ${P7ZIP} t -an -ai@${list}
GUI/p7zipForFilemanager:    ${P7ZIP} x ${flag_ad} -an -ai@${list}
GUI/p7zipForFilemanager:    ${P7ZIP} x ${flag_ad} -o"*" -an -ai@${list}
DOC/MANUAL/cmdline/commands/list.htm:  <A href="../switches/ar_no.htm">-an (Disable parsing of archive_name)</A><BR>
DOC/MANUAL/cmdline/commands/test.htm:  <A href="../switches/ar_no.htm">-an (Disable parsing of archive_name)</A><BR>
DOC/MANUAL/cmdline/commands/extract.htm:  <A href="../switches/ar_no.htm">-an (Disable parsing of archive_name)</A><BR>
DOC/MANUAL/cmdline/commands/extract_full.htm:  <A href="../switches/ar_no.htm">-an (Disable parsing of archive_name)</A><BR>
DOC/MANUAL/cmdline/switches/index.htm:<TR> <TD><A href="ar_no.htm">-an</A></TD> <TD><A href="ar_no.htm">Disable parsing of archive_name</A></TD></TR>
DOC/MANUAL/cmdline/switches/ar_include.htm:7z t -an -air!*.7z
DOC/MANUAL/cmdline/switches/ar_include.htm:  <A href="ar_no.htm">-an (Disable parsing of archive_name)</A>
DOC/MANUAL/cmdline/switches/ar_exclude.htm:7z t -an -ai!*.7z -ax!a*.7z
DOC/MANUAL/cmdline/switches/ar_exclude.htm:  <A href="ar_no.htm">-an (Disable parsing of archive_name)</A>
DOC/MANUAL/cmdline/switches/bs.htm:7z a -si -so -bsp2 -txz -an < file.tar > file.tar.xz
DOC/MANUAL/cmdline/switches/ar_no.htm:  <TITLE>-an (Disable parsing of archive_name) switch</TITLE>
DOC/MANUAL/cmdline/switches/ar_no.htm:<H1>-an (Disable parsing of archive_name) switch</H1>
DOC/MANUAL/cmdline/switches/ar_no.htm:-an
DOC/MANUAL/cmdline/switches/ar_no.htm:7z t -an -ai!*.7z -ax!a*.7z

더 이상 조사하지 않겠습니다. 내 생각엔 매뉴얼 페이지가 어느 시점에서 무시되었거나 병합이 실패했을 수도 있습니다. 하지만 재미있게도 데비안에서는 모든 것이 잘 작동합니다. 이 문제를 해결하려면 별도의 현상금이 필요합니다. 승자는 나니까이것이 패치다.

-an스위치 없이 대처하는 방법에 대한 공식적인, 비공식적인 설명을 찾을 수 없었습니다 .

또 다른 솔루션

더 깊이 조사하고 있는데 구문이 이상하고 문서화도 잘 안 되어 있다는 점을 인정해야겠습니다.

아직 공식적인 설명이 없는 또 다른 솔루션이 있습니다.

$ 7z e .

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=en_GB.UTF-8,Utf16=on,HugeFiles=on,64 bits,2 CPUs Intel(R) Core(TM)2 Duo CPU     U9400  @ 1.40GHz (1067A),ASM)

Scanning the drive for archives:
7 files, 10358 bytes (11 KiB)
    
Extracting archive: ./arch.7z.001
--
Path = ./arch.7z.001
Type = Split
Physical Size = 1024
Volumes = 6
Total Physical Size = 5238
----
Path = arch.7z
Size = 5238
--
Path = arch.7z
Type = 7z
Physical Size = 5238
Headers Size = 114
Method = LZMA2:6k
Solid = -
Blocks = 1

Everything is Ok

Extracting archive: ./in.o
ERROR: ./in.o
Can not open the file as archive

    
Archives: 2
OK archives: 1
Can't open as archive: 1
Size:       5120
Compressed: 5238

$ diff in in.o && echo same
same

시리즈 arch.*는 올바르게 인식되지만 in.o열 수는 없지만 다른 아카이브로 무시됩니다.

설명하다

제가 말할 수 있는 것은 자동 감지뿐입니다.

문서

아직 아님

기타 참고사항

여기서 동일성을 사용하는 것과 확인하는 것의 diff차이점 이 무엇인지 잘 모르겠습니다. cmp나는 그것을 사용해 왔고 diff항상 내가 기대했던 방식으로 작동했습니다. 바이너리 파일을 처리할 수 있는지 확인하는 간단한 테스트는 이전에 사용한 파일을 계속 사용하는 것입니다.

$ echo x >> in
$ diff in in.o
Binary files in and in.o differ

답변2

노력하다

7z -v100m

그러면 아카이브가 100MB 파일로 분할됩니다.

7z -v 옵션은 bkmg(바이트, 킬로바이트, 메가바이트, 기가바이트)를 지원합니다.

소스 참조:https://superuser.com/questions/258872/split-files-on-windows-company-with-linux-cat

답변3

오직

7za x doc.7z.001

연결이 없습니다.

작동하지 않으면 파일이 손상되었거나 이름이 변경된 것입니다.

doc.7z.001의 내용을 확인하세요.

hexdump -C -n 32 doc.7z.001

처음 2바이트에는 7z가 포함되어야 합니다.

그리고

file doc.7z.001

말해야 할 것은 7zip 아카이브입니다.

관련 정보