【问题标题】:gzip files based on regular expression基于正则表达式的 gzip 文件
【发布时间】:2021-10-04 04:13:33
【问题描述】:

如果文件名与正则表达式匹配,我想压缩目录中的所有文件。有没有办法我可以做类似的事情:

gzip \b[^2\W]{2,}\b

现在,当我这样做时,它会给我一个错误,因为它不知道我要匹配正则表达式。

【问题讨论】:

    标签: regex command gzip


    【解决方案1】:
    find -maxdepth 1 -regex '.*\b[^2[^_[:alnum:]]]{2,}\b.*' -exec gzip {} +
    

    -maxdepth 1 阻止 find 遍历子目录,否则这是它的默认行为和主要用途。

    -regex参数需要匹配整个文件名,所以我在两边都加了.*

    【讨论】:

    • 这是个好主意,但是您在几个地方弄乱了语法。 -exec 的参数不应该是 $1(无论如何,基本上是 always quote file name variables),但 {} +find 将遍历子目录,因此您需要添加 -maxdepth 1 来防止这种情况发生。跨度>
    • 我们通常被建议避免在不留下评论的情况下更改代码。如果您不能更改这些内容,我会很乐意在您允许的情况下进行更改。
    • 我看到这篇文章刚刚被编辑。在这两个命令中,我都收到了这个错误:FIND: Parameter format not correct
    • @NathanDai 你在运行什么操作系统?
    • 带有 Cygwin 的 Windows。这可能解释了错误。
    【解决方案2】:

    不清楚您要问的是哪个外壳。 Bash 有 extended glob patterns 但仍然不是正则表达式。对于正确的正则表达式,您需要尝试遍历文件:

    pat='\b[^_[:alnum:]]{2,}\b'
    for file in ./*; do
        if [[ "$file" =~ $pat ]]; then
            gzip "$file"
        fi
    done
    

    Bash 不支持 Perl 兼容的 \W(其中包括 2)所以我切换到 POSIX 字符类 [^_[:alnum:]],它基本上是等效的。或许也可以看看Bash Regular Expression -- Can't seem to match any of \s \S \d \D \w \W etc

    在一般情况下,您始终可以使用单独的正则表达式工具。

    printf '%s\0' ./* |
    perl -0lne 'print if /\b[^2\W]{2,}\b/' |
    xargs -0 gzip
    

    \0 字节的恶作剧是为了稳健地支持任意文件名(想想文件名中带有换行符等);另见http://mywiki.wooledge.org/BashFAQ/020

    【讨论】:

    • OP 没有在 Cygwin 或 Msys 安装上安装 perl 或 find。
    • 这是你的胜利,我能为你做什么?我正要删除它,以便您可以发布正确的答案。对不起。
    • 这并不像我渴望代表(-;但赞成票将不胜感激。
    • 唉,人们仍然认为 Windows 是一个操作系统。
    • 在 96 年,NT4 承诺支持 RISC HAL 和 POSIX。
    猜你喜欢
    • 2011-05-14
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多