代码之家  ›  专栏  ›  技术社区  ›  yegor256

如何按确切路径从zip中排除文件?

zip
  •  -1
  • yegor256  · 技术社区  · 1 年前

    我在目录中有两个文件:

    a/b/FFF/d/e.txt
    x/y/d/d/FFF/f.txt
    

    现在,我想压缩整个目录,不包括匹配的文件 */*/FFF/** 图案因此,第一个文件应该被排除在外,而第二个文件应该进入归档。我这样做:

    $ zip -qq -x '*/*/FFF/*' -r foo.zip .
    

    两个文件都被排除在外(因为 FFF 在他们的道路上找到,我相信):

    $ unzip -l foo.zip
    Archive:  foo.zip
      Length      Date    Time    Name
    ---------  ---------- -----   ----
            0  10-24-2023 14:51   a/
            0  10-24-2023 14:51   a/b/
            0  10-24-2023 14:51   x/
            0  10-24-2023 14:51   x/y/
            0  10-24-2023 14:51   x/y/d/
            0  10-24-2023 14:51   x/y/d/d/
    ---------                     -------
            0                     6 files
    

    我的排除模式出了什么问题?

    顺便说一下:

    $ zip --version
    Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
    This is Zip 3.0 (July 5th 2008), by Info-ZIP.
    
    1 回复  |  直到 1 年前
        1
  •  1
  •   Ktidev    1 年前

    您面临的问题是由于 -x 选项适用于 zip 命令图案 */*/FFF/* 将匹配具有 FFF 作为其第三级目录。这就是为什么两者 a/b/FFF/d/e.txt x/y/d/d/FFF/f.txt 正在被排除在外。

    为了实现您想要的行为,您可以使用 find 生成要包含的文件列表,然后通过管道将该列表发送到 拉链 。以下是您的操作方法:

    1. 使用 发现 列出所有文件,不包括与模式匹配的文件 */*/FFF/*
    2. 通过管道将文件列表发送到 拉链

    以下是一个示例命令序列:

    find . -type f ! -path "*/*/FFF/*" -print0 | zip -qq -@ -r foo.zip

    在此命令中:

    • find . -type f 搜索当前目录及其子目录中的所有文件。
    • ! -path "*/*/FFF/*" 排除与模式匹配的文件。
    • -print0 打印由空字符分隔的文件名,允许使用带有空格、换行符或其他特殊字符的文件名。
    • zip -@ 从标准输入中读取要包含的文件列表。

    这将创建 foo.zip 包含除与模式匹配的文件之外的所有文件的存档 */*/FFF/*