ステージを設ける

ステージを設ける

CentOS端末からマルチパート7zファイル(doc.7z.001、doc.7z.002....、doc.7z.060)を抽出するには?次のコマンドを使用して、すべての部分を1つのファイルにリンクしてみました。

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は次のように記録されます。Debian 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

もう調べません。私の考えでは、マニュアルページがある時点で無視されたか、マージが失敗した可能性があります。しかし、楽しいことに、Debianではすべてがうまくいきます。この問題を解決するには、別の賞金が必要です。勝者は私だからこれがパッチ

-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

おすすめ記事