首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不匹配文件后缀的Glob

不匹配文件后缀的Glob
EN

Stack Overflow用户
提问于 2022-09-27 21:08:01
回答 1查看 51关注 0票数 0

我有一些Unix命令查找具有相应jpg文件的mov-文件:

代码语言:javascript
复制
find . -name '*.[Mm][Oo][Vv]' -exec sh -c '
for mov; do
  for jpg in "${mov%.*}".[Jj][Pp][Gg]; do
    if test -f "$jpg"; then
      echo "$mov" 
    fi
    break
  done
done' sh {} +

当前代码只搜索.jpg (或大写)作为文件扩展名,但我需要扩展它以支持以".jpeg“结尾的文件。

我修改了代码,说:

代码语言:javascript
复制
for jpg in "${mov%.*}".[Jj][Pp][Ee]?[Gg]; do

我认为应该有可能有一个可选的"E或e",但这是行不通的。

我可以用这个代替

代码语言:javascript
复制
for jpg in "${mov%.*}".[Jj][Pp]*[Gg]; do

这是不太安全的,因为它会接受更多的E和E在那个位置。

有什么想法吗?如何修改表达式以在reg中添加可选的e/E?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-27 21:11:16

extglob特性就足够了。在使用shopt -s extglob时运行bash (而不是 sh)将允许您使用?([Ee])引用[Ee]的零个或一个实例。

更好的是,当我们设置shopt标志时,我们可以设置nocaseglob,这样就可以使用*.jp?(e)g,而无需显式字符类。(与此等效的find是将-name更改为-iname,除此之外,还做了以下操作)。

代码语言:javascript
复制
find . -iname '*.mov' -exec bash -c '
shopt -s extglob nocaseglob
for mov; do
  for jpg in "${mov%.*}".jp?(e)g; do
    if test -f "$jpg"; then
      printf "%s\n" "$mov" 
    fi
    break
  done
done' bash {} +
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73873832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档