我正在尝试压缩我的应用程序,并希望排除除一个之外的所有图像目录。
考虑以下文件夹结构:
/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/*'
将您想要从排除目录中包含的一个文件夹添加到同一存档中:
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
表明目录.git
、vendor
和node_modules
except public/assets/images
forpublic/assets/images/icons
将被 忽略find
。
! -name ".env"
告诉 find 忽略名为的文件.env
-exec zip www.zip {} +
对选定的文件运行zip
命令,但命令行是通过在末尾附加每个选定的文件名来构建的;该命令的调用总数将远小于匹配的文件数。结果存储在文件中www.zip
。