web-dev-qa-db-ja.com

ディレクトリ内のすべてのファイルを圧縮しますか?

Zipコマンドを使用して、特定のディレクトリ内のすべてのファイルを圧縮する方法はありますか? *.*の使用を聞いたことがありますが、拡張子のないファイルでも使用できるようにしたいと思っています。

523
tkbx

*だけを使用できます。 *.*は必要ありません。 Unixでは、ファイル拡張子は特別ではありません。 *は、ドットを含む0個以上の文字に一致します。そのため、これはfoo.pngと一致します。これは、0個以上の文字(正確には7文字)であるためです。

*は、デフォルトではドットで始まるファイルと一致しません(*.*も一致しない)。多くの場合、これが必要です。そうでない場合、bashでshopt -s dotglobを使用すると、そうします(ただし、...は除外されます)。他のシェルには、ドットファイルを含める方法が異なります(またはまったくありません)。

または、Zipには、ディレクトリツリー全体を一度に実行する-r(再帰的)オプションもあります(ドットファイルの問題を心配する必要はありません)。

Zip -r myfiles.Zip mydir

ここで、mydirはファイルを含むディレクトリです。生成されたZipには、ファイルだけでなくディレクトリ構造も含まれることに注意してください。 peterphがコメントで指摘しているように、これは通常良いことと見なされます。Zipを抽出すると、抽出されたすべてのファイルが1つのサブディレクトリにきちんと保存されます。

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

Zipコマンドには、その(多くの)オプションのすべてについて説明するドキュメントが付属しています。 man Zipと入力すると、そのドキュメントが表示されます。これはZipに固有のものではありません。この方法でほとんどのコマンドのドキュメントを取得できます。

753
derobert

私の場合、各ファイルを独自のアーカイブに圧縮したかったので、次のようにしました(zshで)。

$ for file in *; do Zip ${file%.*}.Zip $file; done
15

別の方法は、findとxargsを使用することです(これには、Zipに「。」ディレクトリが含まれる場合がありますが、正しく抽出されます。私のテストでは、Zipは圧縮前にドットを取り除きました)find . -type f -exec Zip zipfile.Zip {} +

findのバージョンがexecの+エンドをサポートしていない場合、\;+に置き換えることができます。ただし、速度は遅くなります...)

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

8

これを行う別の(遅い)メソッド(一度に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

これには*(回避策が追加されました)のdotfileの問題があり、ファイルごとにZipを1回起動してアーカイブに追加します。 bashでは、大量のファイルを処理します。

他のほとんどの方法よりも遅くなりますが、比較的簡単です。

2