Linux

使用帶有 zip 命令的正則表達式進行目錄排除

  • January 20, 2020

我正在嘗試壓縮我的應用程序,並希望將我的所有圖像目錄排除在一個之外。

考慮以下文件夾結構:

/images
│
└───/foo // exclude
│
└───/bar // exclude
│
└───/foobar // exclude
│
└───/icons // include

據我了解,該zip命令不允許在其參數中使用正則表達式,因此,我不確定該怎麼做。

我已經做了一些研究,並相信有一種方法可以使用ls/find但我不完全確定如何使用。誰能建議我怎麼做?

這是我目前的命令(不包括所有圖像目錄):

zip -rq application.zip . -x vendor/\* node_modules/\* .git/\* .env public/assets/images/\*

我相信我需要這樣的東西(我還沒有讓正則表達式真正起作用):

find ./public/assets/images -maxdepth 1 -regex '\.\/(?!icons).* | zip -rq application.zip . -x vendor/\* node_modules/\* .git/\* .env INSERT_FIND_RESULTS_HERE

更新

完整的應用程序目錄類似於以下內容:

/www
│   .env
│   .env.example
│   .env.pipelines
│   .gitignore
│   artisan
│   etc...
│
└───/.ebextensions
└───/.git
└───/app
└───/bootstrap
└───/config
└───/database
└───/infrastructure
└───/node_modules
└───/public
│   │   .htaccess
│   │   index.php
│   │   etc...
│   │
│   └───/assets
│   │   └───/fonts
│   │   └───/images
│   │   │   └───/blog
│   │   │   └───/brand
│   │   │   └───/capabilities
│   │   │   └───/common
│   │   │   └───/contact
│   │   │   └───/icons
│   │   │   └───/misc
│   │   │   └───etc...
│   │
│   └───/js
│   └───/css
│   
└───/storage
└───/tests
└───/vendor

我想壓縮所有文件,不包括:

vendor/
node_modules/
.git/
.env
public/assets/images/ (excluding public/assets/images/icons)

更新 2

自發布以來,我了解到find它的正則表達式中不允許前瞻,因此我需要使用grep和 find 的組合。因此,這是我最新的命令(雖然仍然不起作用):

find ./public/assets/images -maxdepth 1 -regex '\./public/assets/images/.*' | grep -oP '\./public/assets/images/(?!icons).*' | xargs zip -rq application.zip . -x vendor/\* node_modules/\* .git/\* .env

請注意,我不知道如何使用xargs,我相信這就是上述內容無法按預期工作的原因。

我的建議是分兩步創建存檔:

  1. 創建存檔,排除您要排除的所有內容:
zip -r application.zip . -x 'vendor/*' 'node_modules/*' '.git/*' .env 'public/assets/images/*'
  1. 將要從排除目錄中包含的一個文件夾添加到同一個存檔中:
zip -r application.zip public/assets/images/icons/

(預設行為zip是將文件添加到現有存檔,如果它已經存在)

請嘗試發出以下命令

find /www \( -path "*/public/assets/images/*" -a  \( ! -path "*/public/assets/images/icons" -a ! -path "*/public/assets/images/icons/*" \) \) -o \( -path "*/.git*" \) -o \( -path "*/vendor*" \) -o \( -path "*/node_modules*" \) -prune -o \( ! -name ".env" \) -exec zip www.zip {} +

解釋

以參數開頭並以參數/www結尾的第一個表達式表明-prune目錄.gitvendor和except將被 忽略。node_modules``public/assets/images``public/assets/images/icons``find

! -name ".env"告訴 find 忽略名為.env

-exec zip www.zip {} +在選定的文件上執行zip命令,但命令行是通過在末尾附加每個選定的文件名來建構的;該命令的呼叫總數將遠少於匹配文件的數量。結果儲存在文件中www.zip

引用自:https://unix.stackexchange.com/questions/562759