zip ファイルを作成するときに、すべてのサブディレクトリから特定のファイルを除外します。

zip ファイルを作成するときに、すべてのサブディレクトリから特定のファイルを除外します。

圧縮する親フォルダのすべてのサブディレクトリにあるすべての.zipファイルを除外したいのですが、うまくいきません。man zipページを確認しましたが、これそしてこれ質問しても成功しませんでした。

私が試してみました:

zip -q -r FILE.zip * -x \*.zip
zip -q -r FILE.zip * -x\*.zip
zip -q -r FILE.zip * -x */\.zip
zip -q -r FILE.zip * -x \*.zip
zip -q -r FILE.zip * -x \*.zip\*
zip -q -r FILE.zip * -x*.zip

そして、すべての zip ファイルが含まれます (このコマンドで以前に生成された親フォルダー内のファイルは除きます)。

編集:問題は、フォルダ内にすでにZIPファイルを含むFILE.zipがあったことです。zipコマンドアップデートの代わりに作成する-u オプションを指定しない場合でも、作成しようとしたファイルがすでに存在する場合は、新しい圧縮ファイルが作成されます。

答え1

すでに試したように、除外パターンを引用符で囲む必要があります。「より良い」解決策がある場合でも、最初のパターンが実際に機能するはずです。

しかし、ここでは単純化された例を見てみましょう。拡張子が のファイルを含むディレクトリをいくつか作成しまし.foo.bar

findここで、テスト ディレクトリを一覧表示するには、次のように実行します。すべてのファイルとディレクトリが表示されます。

$ find
.
./1.bar
./1.foo
./sub1
./sub1/sub2
./sub1/sub2/1.bar
./sub1/sub2/1.foo
./sub1/1.foo
./sub1/1.bar

これで、何が機能するかを確認できます
(出力ファイルは削除しますが、マッチングには関係ありません)。

すべてのファイルをパックする:

$ zip -r /tmp/out.zip *          
  adding: 1.bar (stored 0%)
  adding: 1.foo (stored 0%)
  adding: sub1/ (stored 0%)
  adding: sub1/sub2/ (stored 0%)
  adding: sub1/sub2/1.bar (stored 0%)
  adding: sub1/sub2/1.foo (stored 0%)
  adding: sub1/1.foo (stored 0%)
  adding: sub1/1.bar (stored 0%)

ファイルを除く梱包.foo:

$ rm /tmp/out.zip
$ zip -r /tmp/out.zip * -x '*.foo'
  adding: 1.bar (stored 0%)
  adding: sub1/ (stored 0%)
  adding: sub1/sub2/ (stored 0%)
  adding: sub1/sub2/1.bar (stored 0%)
  adding: sub1/1.bar (stored 0%)

うまくいきました!
最初のパターンでもう一度試してみます:

$ rm /tmp/out.zip
$ zip -r /tmp/out.zip * -x \*.foo 
  adding: 1.bar (stored 0%)
  adding: sub1/ (stored 0%)
  adding: sub1/sub2/ (stored 0%)
  adding: sub1/sub2/1.bar (stored 0%)
  adding: sub1/1.bar (stored 0%)

動作します!

それで...そこで実際に何を実行したのかをよく見てください。

まず-q、「quiet」オプションを削除して、例に示されている標準メッセージを非表示にします。
次のステップとして、-v「verbose」オプションを追加して、より詳細な情報を表示します。詳細が多すぎるかもしれませんが、興味深い情報を見つけられるかもしれません。


コメントから、削除すると-qすでに効果があることがわかります。

根本的な問題は、テストに使用された zip コマンドが出力ファイルの存在によって変更されたことです。
技術的には、それ自体も変更されていました...

からman zip:

Command format.  The basic command format is

               zip options archive inpath inpath ...

        where archive is a new or existing zip archive and inpath is a directory or
        file path optionally including wildcards.  When given the name of an exist‐
        ing zip archive, zip will replace identically named entries in the zip  ar‐
        chive (matching the relative names as stored in the archive) or add entries
        for new names.

関連情報