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 아카이브입니다.