web-dev-qa-db-ja.com

コマンドラインで複数のファイルを圧縮するにはどうすればよいですか?

この最も基本的な質問は受け入れてください。しかし、スタック交換に関する直接的な答えや簡単な例を見つけることができませんでした。

ひどいWindowsの友達と共有できる1つのZipファイルに圧縮したいファイルのフォルダーがあるとしましょう(そうでなければ、tarを使用して、それで終わりです)。次のようになります。

.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
└── test.jpg

Zipがインストールされていると仮定します:

Sudo apt-get install Zip

man Zipから、ファイルリストを使用できることがわかります。

-@ファイルリスト。ファイルリストが-@ [MacOS以外]として指定されている場合、Zipは入力ファイルのリストをコマンドラインではなく標準入力から取得します。例えば、

          Zip -@ foo

そこで、次のようなZip.lstを作成しました。

cat Zip.lst

file1.txt
file2.txt
file3.txt
file.jpg
test.jpg

そして今、私は試しました:

Zip -@ Zip.lst

しかし、コンソールに空白行を作成する以外は何もしませんでした。そして、私は押し続けることができます Enter そして、コマンドを一見実行せずに、さらに空白行を作成し続けます。いくつかの検索の後、を押して入力を終了する必要があることに気付きました Ctrl+D

しかし、今私はこのエラーを受け取ります:

    Zip warning: missing end signature--probably not a Zip file (did you
    Zip warning: remember to use binary mode when you transferred it?)
    Zip warning: (if you are trying to read a damaged archive try -F)

Zip error: Zip file structure invalid (Zip.lst)

何!?私の単純なリストは「有効なファイル構造」ではありませんか?詳細についてはマニュアルに戻り、以下を詳しく見てみましょう。

Ifファイルリストが-@ ...として指定されている.

だから私は-@なしでそれを試して、それは少なくとも押すことなくすぐにそれを処理します Ctrl+D しかし、同じエラーが残っています。

幸いなことに、Zipファイルに明示的に名前を付ける必要があることに気づいた、ほとんど無関係な質問への回答に コメント が見つかりました。デフォルトでは、Zip.lstというZipファイルを作成しようとしたため、このエラーが発生しました。しかし、それは私のリストの名前なので、単純にリストを上書きすると思うかもしれませんが、いや、実際にはリストを更新しようとしていました。また、リストは明らかにZipファイルではないため、無効なファイル構造エラーが発生し、「Zipファイルではない可能性が高い」という理由が明らかになりました。それで私は試しました:

Zip files.Zip zip.lst

adding: Zip.lst (deflated 35%)

Eureka!Zipファイルが作成され、フォルダーに次の内容が含まれていることがわかります。

.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
├── files.Zip
├── test.jpg
└── Zip.lst

ただし、祝う前に、まずZipファイルの内容を確認しましょう。

unzip -l files.Zip

Archive:  files.Zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       48  2016-05-24 15:30   Zip.lst
---------                     -------
       48                     1 file

いいえ!まあ、実際には標準の使用法から理にかなっています。なぜなら、リストファイルを1つだけ圧縮したからです。最後に-@で再試行しましたが、同じ結果が得られました。

何が間違っているのですか?

ところで、GUIを使用してマウスで実行できることはわかっていますが、これをスクリプト化する必要があり、一般に、自分が何をしているのかわかっているとCLIの方が速くなります。

16
Jeff Puckett

ファイル<リダイレクトを使用

Zip files.Zip -@ < Zip.lst

または、リストをスキップしてグロブすることもできます

Zip files.Zip *.txt *.jpg

ありがとう スチールドライバー

歴史的な答え

自分の質問に答えても構いません 涙の跡をたどる他の人たちがキーワードを検索することで救われることを期待して混乱を記録したかったからです。

最終的に、私は 正しい答え を発見しましたが、間違った質問に投稿されました。

明確さのいくつかのポイント:

  • このマニュアルでは、ファイル内のリテラルリストを参照しているのではなく、コンソール上でファイルをリストすることを示しています。
  • 誰かがfooがファイルリストを参照していると誤解される可能性があることは理解できますが、実際には出力Zipファイルの名前を表すことを意図しています。
  • この例では、-@スイッチを使用しているため、ファイルのリストは省略されています。このスイッチは、「からではなくstandard inputcommand line"

これを理解して、私たちは現在、目標を達成するためのさまざまな方法で武装しています。

まず、作成したファイルリストを使用して、catを使用してリストを読み取り、Zipへの標準入力としてパイプを使用して出力をリダイレクトできます。

cat Zip.lst | Zip -@ files.Zip

  adding: file1.txt (stored 0%)
  adding: file2.txt (stored 0%)
  adding: file3.txt (stored 0%)
  adding: file.jpg (stored 0%)
  adding: test.jpg (stored 0%)

各ファイルのadding: ...を確認することは確かに良い兆候ですが、前もって期待していたので、確認しましょう。

unzip -l files.Zip

Archive:  files.Zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2016-05-24 14:54   file1.txt
        0  2016-05-24 14:54   file2.txt
        0  2016-05-24 14:54   file3.txt
        0  2016-05-24 15:00   file.jpg
        0  2016-05-24 14:59   test.jpg
---------                     -------
        0                     5 files

SWEET!しかし、とにかく使い捨てのリストを作成したいのは誰ですか?これは、この特定のシナリオを解決するひどいラウンドアバウト方法です。 lsからリストを取得し、それをZipにパイプすることをお勧めします。

ls | Zip -@ files.Zip

  adding: file1.txt (stored 0%)
  adding: file2.txt (stored 0%)
  adding: file3.txt (stored 0%)
  adding: file.jpg (stored 0%)
  adding: test.jpg (stored 0%)

素晴らしい!次に、grepの強力なフィルターを作成して、たとえばjpgを圧縮します。

ls | grep .jpg | Zip -@ images.Zip

  adding: file.jpg (stored 0%)
  adding: test.jpg (stored 0%)

または、「file」で始まるファイルのみ

ls | grep file. | Zip -@ files.Zip

  adding: file1.txt (stored 0%)
  adding: file2.txt (stored 0%)
  adding: file3.txt (stored 0%)
  adding: file.jpg (stored 0%)
21
Jeff Puckett

最大圧縮レベルの最も単純なコマンド

Zip -9 -r filename.Zip /path/to/dir singlefile.jpg 
6
Ansyori