使用正则表达式和 zip 命令进行目录排除

使用正则表达式和 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,我相信这就是为什么上面的方法不能按预期工作的原因。

答案1

我的建议是分两步创建存档:

  1. 创建存档,排除您想要排除的所有内容:

    zip -r application.zip . -x 'vendor/*' 'node_modules/*' '.git/*' .env 'public/assets/images/*'
    
  2. 将您想要从排除目录中包含的一个文件夹添加到同一存档中:

    zip -r application.zip public/assets/images/icons/
    

(默认行为是zip将文件添加到现有存档(如果已存在)

答案2

请尝试发出以下命令

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表明目录.gitvendornode_modulesexcept public/assets/imagesforpublic/assets/images/icons将被 忽略find

! -name ".env"告诉 find 忽略名为的文件.env

-exec zip www.zip {} +对选定的文件运行zip命令,但命令行是通过在末尾附加每个选定的文件名来构建的;该命令的调用总数将远小于匹配的文件数。结果存储在文件中www.zip

相关内容