この最も基本的な質問は受け入れてください。しかし、スタック交換に関する直接的な答えや簡単な例を見つけることができませんでした。
ひどい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の方が速くなります。
ファイル<
リダイレクトを使用
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%)
最大圧縮レベルの最も単純なコマンド
Zip -9 -r filename.Zip /path/to/dir singlefile.jpg