建立 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 檔案(除了之前使用此命令生成的父資料夾中的檔案)。

編輯:問題是我的資料夾中已經有一個 FILE.zip,其中包含一些 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“安靜”選項,隱藏我的範例中顯示的標準訊息。
下一步,添加-v“詳細”選項,以查看更多詳細資訊 - 也許太多,但也許您可以發現一些有趣的東西。


從評論中我看到刪除-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.

相關內容