zip
コマンドを使用して、特定のディレクトリ内のすべてのファイルを圧縮する方法はありますか? *.*
を使用することを聞いたことがありますが、拡張子のないファイルでも機能するようにしたいと思います。
コメント
回答
*
を使用できます。必要はありません。 *.*
の場合。ファイル拡張子はUnixでは特別ではありません。*
は0個以上のchに一致しますaracters-ドットを含む。したがって、foo.png
と一致します。これは、0文字以上(正確には7文字)であるためです。
*
はデフォルトでは、ドットで始まるファイルとは一致しません(*.*
も一致しません)。これはしばしばあなたが望むものです。そうでない場合、bashで、shopt -s dotglob
を実行すると、実行されます(ただし、.
と..
)。他のシェルには、ドットファイルを含める方法が異なります(またはまったくありません)。
または、zip
にも-r
ディレクトリツリー全体を一度に実行する(再帰的)オプション(ドットファイルの問題について心配する必要はありません):
zip -r myfiles.zip mydir
where mydir
は、ファイルを含むディレクトリです。生成されたzipには、ファイルだけでなくディレクトリ構造も含まれることに注意してください。 peterphがコメントで指摘しているように、これは通常、良いことと見なされます。zipを抽出すると、抽出されたすべてのファイルが1つのサブディレクトリにきちんと保存されます。
zipにパスを保存しないように指示することもできます。 -j
/ --junk-paths
オプション。
zip
コマンドにはその(多くの)オプションのすべてについて説明しているドキュメント。 man zip
と入力して、そのドキュメントを表示します。これはzipに固有のものではありません。この方法で、ほとんどのコマンドのドキュメントを入手できます。
コメント
- 追加することをお勧めします。アーカイブ内のすべてをトップレベルのディレクトリに含めることをお勧めします。これにより、抽出時に現在のディレクトリを汚染しないようになります。'
- @peterph完了。これは、たとえばtarfilesよりもzipファイルの慣例ではありませんが、'恐れています。
- 残念ながらそうです。おそらくウィンドウが原因です。ドラッグの遺産' n 'ソースコードを操作するデスクトップとLinuxの遺産にドロップします。
-
*
シェルグロビングにはドットファイル(.
divで始まるファイル名)が含まれていないことに注意してください' >)。これは、ディレクトリ全体を名前で圧縮するもう1つの利点です。 - ただし、-rを使用すると、ディレクトリ自体が含まれるため、I 'やっています。 ' t *
.
と..
を含めませんか?
回答
私の場合、各ファイルを独自のアーカイブに圧縮したかったので、次のようにしました(zsh
):
$ for file in *; do zip ${file%.*}.zip $file; done
コメント
- あり'ここに
mkv
はありませんか?また、ここでは特にzsh
固有のものはありません。 'ファイル名を含む変数を適切に引用する必要があるため、zip "${file%.*}.zip" "$file"
両方の変数を二重引用符で囲みます。 - @tripleeeまず、
mkv
への誤った参照を指摘していただきありがとうございます。次に、bash
とは異なり、zsh
では引数を引用する必要はありません。そのため、'これがzsh
のコマンドであると指定した理由です。 - 最後のセミコロンをアンパサンドはそれを大幅にスピードアップするかもしれません(ディレクトリ内のファイルの数が妥当な場合…)。それ以外の場合、
find . -type f -maxdepth 1 -print0|xargs -r0 -n1 -P64 -I{} bash -c 'f="{}"; zip "${f%.*}.zip" "$f"'
(-P
はCPUスレッドに応じて調整されます…)(多くのGNU依存関係…) - 各ファイルを独自のアーカイブに圧縮するには、
gzip *
回答
を実行します。
別の方法は、findとxargsを使用することです:(これにはzipに「。」ディレクトリが含まれる場合がありますが、それでも正しく抽出されるはずです。私のテストでは、zipは前にドットを削除しました圧縮)find . -type f -exec zip zipfile.zip {} +
(+
は\;
お使いのバージョンのfind
がexecの+
終了をサポートしていない場合。ただし、速度は遅くなります…)
これには、デフォルトですべてのサブディレクトリが含まれます。 GNUで、-maxdepth
がそれを防ぐことができます。
コメント
- (
、これにはドットファイルが含まれ、ディレクトリ内のファイルが多すぎる場合は'フォールオーバーしません)
回答
これを行う別の(遅い)メソッド(一度に1つのファイルをzipに追加します):
for f in * .[^.]*; do [ -r "$f" ] || continue # Skip directories or non-existant files (Probably ".[^.]*" if directory has no dotfiles). Using -e will allow directories to be used as well zip zipfile.zip "$f" # If directories are included, you probably want to add -r done
これには*
のドットファイルの問題があり(回避策が追加されました)、ファイルごとに1回zipを開始し、アーカイブに追加します。 bash
では、大量のファイルを処理します。
他のほとんどの方法よりも低速ですが、比較的簡単です。
コメント
- これは、受け入れられた回答よりも単純ではなく、遅いため、質問が表示されます:"なぜ誰かがこれを行うのですか?"。その質問に答えられる場合は、そのコンテキストを答えに入れることをお勧めします。そうでない場合は、すでに良い答えがある古い質問に対する悪い答えだと思います。
- @Centimane:制限に注意します。これには教育的価値があると思います。 (ディレクトリをスキップしない場合、それは非常に簡単です)。代わりに(標準の)外部ツールを使用してはるかに高速な回答が必要な場合は、他の回答がそれをカバーします。 (ドットファイルの処理が削除されているため(質問に記載されていない場合は正確さに影響します)、非常にエレガントだと思います):
for f in *; do zip zip.zip "$f"; done
- 受け入れられたことに注意してください回答は'外部コマンドを使用しないため、より高速になります。この回答はどのようなシナリオで役立ちますか?
- @Centimane bashがパラメーターとして渡すことができるファイルよりも多くのファイルがある場合、tarを使用します。 (find + xargsの方が優れており、forループの方が簡単です…)。それは質問に対する(ユニークな)答えです。それは確かに最適な答えではありません。 (最適でない回答は、誰かがわずかに異なる状況にある場合、たとえばtarファイルにディレクトリを入れたい場合など、同様の問題に役立つ可能性があります)
zip myarch.zip mydir/*
を実行してみましたか?zip -r myarch.zip mydir/*
zip -r myarch.zip mydir
*.*
は、ドットのあるファイルを意味します。 cp / mとdosのすべてのファイルにドットがあり、それを入力するようになりました(*
を実行できませんでした)。したがって、人々は*.*
をすべてのファイルとして。最終的にMicrosoftは、ドットが0個以上になる可能性のある長いファイル名を追加しました。ウィンドウにドットがあるファイルを見つけるには、*.*.*
と入力する必要があります。