【发布时间】:2021-10-04 04:13:33
【问题描述】:
如果文件名与正则表达式匹配,我想压缩目录中的所有文件。有没有办法我可以做类似的事情:
gzip \b[^2\W]{2,}\b
现在,当我这样做时,它会给我一个错误,因为它不知道我要匹配正则表达式。
【问题讨论】:
如果文件名与正则表达式匹配,我想压缩目录中的所有文件。有没有办法我可以做类似的事情:
gzip \b[^2\W]{2,}\b
现在,当我这样做时,它会给我一个错误,因为它不知道我要匹配正则表达式。
【问题讨论】:
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
不清楚您要问的是哪个外壳。 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
【讨论】: