如何用bash find命令通过单个-name模式匹配多个指定文件名?
使用单个模式匹配指定文件名的find命令写法
嘿,我明白你想简化find命令,用单个模式替代一堆-name参数的需求。这里得先理清一个关键点:find的-name选项用的是shell glob通配符,而glob本身不支持直接的“或”逻辑来匹配多个精确文件名。不过有两种靠谱的方法能实现你要的效果:
方法1:用-regex实现单个正则模式匹配
这是最直接满足你“单个模式”需求的方案,因为find的-regex支持正则表达式的“或”逻辑。比如你要匹配的那几个文件,可以这么写:
find . -type f -regex './\(fname1\.jpg\|fname2\.png\|myfile\.css\|example\.gif\)'
解释下细节:
./是因为find默认会把匹配的路径写成相对当前目录的格式(比如./fname1.jpg),所以正则得带上这个前缀才能匹配\( ... \)是正则的分组语法,\|用来分隔不同的文件名(注意在基础正则里需要转义)- 每个文件名里的
.要转义成\.,因为正则里的.默认匹配任意字符,不转义会出错
如果你用的是GNU find(大部分Linux发行版默认都是),还可以切换到扩展正则模式,写法更简洁:
find . -type f -regextype posix-extended -regex './(fname1\.jpg|fname2\.png|myfile\.css|example\.gif)'
这里不需要转义括号和竖线,可读性高很多。
方法2:用shell括号扩展(语法糖式简化)
如果你非要纠结用-name,可以借助bash的括号扩展让shell帮你生成多个-name参数,但这其实只是语法糖,本质还是多个-name参数的变形:
find . -type f -name @(fname1.jpg|fname2.png|myfile.css|example.gif)
不过这个需要先开启bash的extglob扩展(一般默认是开启的,如果没开可以用shopt -s extglob临时开启)。
总结
如果你的核心需求是用一个模式字符串完成匹配,那-regex是最优解;如果只是想少写几个-name参数,shell的extglob扩展也能凑合用,但本质还是多参数的变形。
内容的提问来源于stack exchange,提问作者Simone Bonelli
相关产品推荐
相关产品推荐

