一部のサブフォルダの内容を圧縮し、他のフォルダを圧縮しない

一部のサブフォルダの内容を圧縮し、他のフォルダを圧縮しない

unix zipコマンドを使用してディレクトリを圧縮したいと思います。ディレクトリが次のように構成されているとします。

dir1/
dir1/dir2/
dir1/dir2/file1
dir1/dir2/file2
dir1/dir3
dir1/dir3/file1
dir1/file1
dir1/file2

含めるdir1ように圧縮したいが含まれません。簡単に言えば、その下のすべてのファイルとすべてのファイルを圧縮したいのですが、どのファイルも圧縮したくありません。dir1.zipdir1.zipdir1/file1, dir1/file2, dir1/dir2/file1, dir1/dir2/file2, dir3/dir1/dir3/file1dir1dir2dir3

これにより、その中のすべてのファイルとサブフォルダがzip dir1 dir1/圧縮されますdir1が、サブフォルダの内容は圧縮されません。これにより、すべてのファイルとすべてのサブフォルダを含むzip -r dir1 dir1/その中のすべてのコンテンツが圧縮されます。dir1どのサブフォルダを再帰的に圧縮するか、どのサブフォルダを圧縮しないかを制御できるようにしたいです。

ありがとうございます。

答え1

$ zip -r dir1 dir1 -x dir1/dir3/*

私のために動作します。-x除外オプションです。インクルードオプションも使用できますが、この場合、除外オプションには入力が必要ありません。

実際、この問題は完全には明確ではありません。下のすべてのディレクトリとファイルを除外しますかdir3、または下のファイルのみを除外しますかdir3?上記のコマンドは後者でのみ機能します。

答え2

アーカイブファイルを使用する1つの方法は、そのファイルをマウントしてから通常のディレクトリのようにアクセスすることです。ヒューズ次のように使用できます。ほとんどのユニスそしていくつかのことをサポートします圧縮ファイルへのファイルシステムの透過アクセス。 zipファイルの場合、可能性は次のとおりです。ヒューズジッパーAVFSまた便利ですが読み取り専用です。

たとえば、fusion-zipを使用してアーカイブをマウントし、ここにファイルをコピーする方法は次のとおりです。

mkdir tmp
fuse-zip /path/to/zip tmp
rsync -av --exclude='/dir1/dir3/*' dir1 tmp/
fusermount -u tmp; rmdir tmp

答え3

dir1の親ディレクトリで次のコマンドを試してください。

tar --exclude=dir3/* -cf - dir1/ | zip dir1.zip -

dir1.zip を解凍するには、次のコマンドを使用します。

unzip -p dir1.zip | tar xf -

答え4

信頼できる唯一の方法は、zipアーカイブするファイルのリストを渡すことです。たとえば、次のようになります。

find dir1 \! \( -path dir1/dir3 -prune \) | sort | zip dir1.zip -@

これにより、アーカイブに除外されたディレクトリやそのサブディレクトリは含まれません。の引数は、そのディレクトリの出力と正確に一致する必要があります-pathfindバラよりこの回答複数のディレクトリを整理する方法を学びます。

関連情報