Zip
コマンドを使用して、特定のディレクトリ内のすべてのファイルを圧縮する方法はありますか? *.*
の使用を聞いたことがありますが、拡張子のないファイルでも使用できるようにしたいと思っています。
*
だけを使用できます。 *.*
は必要ありません。 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に固有のものではありません。この方法でほとんどのコマンドのドキュメントを取得できます。
私の場合、各ファイルを独自のアーカイブに圧縮したかったので、次のようにしました(zsh
で)。
$ for file in *; do Zip ${file%.*}.Zip $file; done
別の方法は、findとxargsを使用することです(これには、Zipに「。」ディレクトリが含まれる場合がありますが、正しく抽出されます。私のテストでは、Zipは圧縮前にドットを取り除きました)find . -type f -exec Zip zipfile.Zip {} +
(find
のバージョンがexecの+
エンドをサポートしていない場合、\;
は+
に置き換えることができます。ただし、速度は遅くなります...)
これにはデフォルトですべてのサブディレクトリが含まれます。 GNU find -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
これには*
(回避策が追加されました)のdotfileの問題があり、ファイルごとにZipを1回起動してアーカイブに追加します。 bash
では、大量のファイルを処理します。
他のほとんどの方法よりも遅くなりますが、比較的簡単です。