为每个子文件夹创建 Zip,但仅包含匹配的文件

为每个子文件夹创建 Zip,但仅包含匹配的文件

我试图弄清楚如何为每个仅包含符合我的条件的文件的子文件夹创建一个 zip 文件。

例如我有:

Folder1
Folder2
Folder3

每个文件夹都包含相同的文件集,但每个文件夹中的文件名略有不同,但扩展名始终相同。我想将 .shp、.shx、.qpj、.prj 和 .dbf 压缩到每个文件夹中。每个文件夹都是其自己的 zip 文件。我宁愿不存储实际的文件夹名称,而是将其存储为 zip 文件的名称。

我努力了:

find . -type d | xargs -I {} zip -r {}.zip {}

这会创建每个 zip 文件,但会压缩每个文件,而不仅仅是具有我想要的扩展名的文件,它还将文件夹名称存储在 zip 中。

find . -type d | xargs -I {} zip -r {}.zip {}'/'*.shp {}'/'*.shx {}'/'*.dbf {}'/'*.prj {}'/'*.qpj 

上面除了给出无事可做的错误之外什么也没做。

希望我的糟糕尝试能让我更好地了解我正在尝试做的事情。

任何帮助表示赞赏。

答案1

如果目录名称中所有的奇怪之处在于它们有空格,那么应该这样做:

shopt -s nullglob
for dir in */;do
    dir="${dir%/}"
    zip "$dir".zip "$dir"/*.{shp,shx,qpj,prj,dbf}
done

答案2

好吧,不确定是否可以使用一个内衬,也许可以。但我做了你需要的事情:

OIFS=$IFS
IFS='\n'
find . -type d -maxdepth 1 | while read -r i; do
    find $i -name "*.shp" -o -name "*.shx" -o -name "*.shx" -o -name "*.prj" -o -name "*.qpj" |zip -@ "$i".zip
done
IFS=$OIFS

每个 zip 文件都是您的目录名称。

相关内容