Linux
使用帶有 zip 命令的正則表達式進行目錄排除
我正在嘗試壓縮我的應用程序,並希望將我的所有圖像目錄排除在一個之外。
考慮以下文件夾結構:
/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
,我相信這就是上述內容無法按預期工作的原因。
我的建議是分兩步創建存檔:
- 創建存檔,排除您要排除的所有內容:
zip -r application.zip . -x 'vendor/*' 'node_modules/*' '.git/*' .env 'public/assets/images/*'
- 將要從排除目錄中包含的一個文件夾添加到同一個存檔中:
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
目錄.git
、vendor
和except將被 忽略。node_modules``public/assets/images``public/assets/images/icons``find
! -name ".env"
告訴 find 忽略名為.env
-exec zip www.zip {} +
在選定的文件上執行zip
命令,但命令行是通過在末尾附加每個選定的文件名來建構的;該命令的呼叫總數將遠少於匹配文件的數量。結果儲存在文件中www.zip
。