ディレクトリ内の全てのファイルをZipする?

与えられたディレクトリ内のすべてのファイルを zip コマンドで圧縮する方法はありますか?.`を使う方法は聞いたことがありますが、拡張子のないファイルにも対応してほしいのです。

ソリューション

単に*を使えばいいのです。*.*は必要ありません。Unixではファイルの拡張子は特別なものではありません。* はゼロ以上の文字(ドットを含む)にマッチします。つまり、foo.pngは0文字以上(正確には7文字)にマッチするのです。

デフォルトでは、*はドットで始まるファイルにはマッチしないことに注意してください(*.*もマッチしません)。これはしばしばあなたが望むものです。そうでなくても、bashでは、shopt -s dotglobとすると、マッチします(ただし、...は除外されます)。他のシェルでは、ドットファイルを含める方法が異なる(あるいは全くない)場合があります。

代わりに、zip には -r (recursive) オプションがあり、ディレクトリツリー全体を一度に処理することができます (そして、ドットファイルの問題を気にする必要はありません)。

zip -r myfiles.zip mydir

ここで、mydir はファイルのあるディレクトリです。生成される zip には、ファイルだけでなく、ディレクトリ構造も含まれていることに注意してください。peterph氏がコメントで指摘しているように、これは通常、良いことだと考えられます。ZIPを展開すると、展開されたすべてのファイルが1つのサブディレクトリにきちんと格納されます。

また、-j/--junk-pathsオプションで、パスを保存しないようにZIPに指示することもできます。

zipコマンドには、すべての(多くの)オプションについて説明したドキュメントが付属しています。ドキュメントを見るには、man zip`と入力してください。これは zip に限ったことではなく、ほとんどのコマンドのドキュメントをこの方法で得ることができます。

解説 (16)

私の場合は、各ファイルをそれぞれのアーカイブにまとめたかったので、次のようにしました(zshで)。

$ for file in *; do zip ${file%.*}.zip $file; done
解説 (3)

別の方法としては、findとxargs:を使う方法があります(この方法では、ZIPの中に"." ディレクトリが含まれるかもしれませんが、それでも正しく解凍されるはずです)。私のテストでは、zipは圧縮前にドットを取り除いていました) find .-type f -exec zip zipfile.zip {}。+

(お使いの find+ による exec をサポートしていない場合、+\; で置き換えることができます。遅くなりますが...)

デフォルトでは、すべてのサブディレクトリが含まれます。GNU findでは -maxdepth でこれを防ぐことができます。

解説 (1)