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


16

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

私がひどい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)

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

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

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

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

zip files.zip zip.lst

adding: zip.lst (deflated 35%)

ユーレカ!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

番号!まあ、実際にはそれは標準の使用法から理にかなっています。なぜなら、リストファイルを圧縮しただけだからです。最後にもう一度試してみまし-@たが、同じ結果が得られました。

私は何を間違えていますか?

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

回答:


23

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

zip files.zip -@ < zip.lst

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

zip files.zip *.txt *.jpg

おかげでスチールドライバー

歴史的な答え

私は自分の質問に答えても大丈夫です。涙をたどって追跡する他の人たちがキーワードを検索することで助かることを期待して、混乱を記録したかったからです。

最終的に、正しい答えを見つけまし、間違った質問に投稿されました

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

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

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

まず、作成したファイルリストを使用して、リストを読み取り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

甘い!しかし、とにかく使い捨てのリストを作成したいのは誰ですか?これは、この特定のシナリオを解決するひどいラウンドアバウト方法です。リストを取得し、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%)

5
代わりに使用するlsgrepとジップの-@、あなたはジップコマンドラインなどに直接ファイルを選択するために、シェルグロブを使用することができますzip files.zip file*zip images.zip *.jpg。また、ファイルからファイル名のリストを使用しているとき、あなたは代わりに別の猫のプロセスを呼び出すのリダイレクトを使用することができ、zip files.zip -@ < zip.lst
steeldriver

ファイルと一緒にネストされたディレクトリでこれをどのように機能させることができますか?
BallpointBen

@BallpointBenのfind代わりに使用したいls
ジェフパケット

6

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

zip -9 -r filename.zip /path/to/dir singlefile.jpg 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.