基于正则表达式的 gzip 文件

gzip files based on regular expression

如果文件名与正则表达式匹配,我想对目录中的所有文件进行 gzip 压缩。有什么方法可以做类似的事情:

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

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

find -maxdepth 1 -regex '.*\b[^2[^_[:alnum:]]]{2,}\b.*' -exec gzip {} +

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

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

不清楚 shell 你问的是哪个。 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 字符 class [^_[:alnum:]] 这基本上是等价的。或许还可以参见 Bash Regular Expression -- Can't seem to match any of \s \S \d \D \w \W etc

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

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

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