如何让“查找”仅匹配特定子目录中的文件

如何让“查找”仅匹配特定子目录中的文件

我在 Mac OS X 10.6.8 上使用 bash。

使用find命令,我想搜索匹配的文件*.XML。但是,我只想匹配16xxxx子目录中的文件,而不是16yyyy来自某些基本目录的文件。

basedir/16xxxx/EX1.XML
basedir/16xxxx/EX2.XML
basedir/16yyyy/EX3.XML
basedir/16yyyy/EX4.XML

我正在寻找的结果是EX1.XMLEX2.XML(为了清楚起见,排除完整路径名)。

这是在 BASH 脚本的上下文中,如果我可以输入要传递给命令的16xxxx/*.XML表达式,将会很方便:-namefind

find basedir -name '16xxxx/*.XML'

但是,由于 shell 与字符不匹配,因此不会返回任何匹配项/。是否有一些参数可以传递,find或者有一种方法可以转义16xxxx/\*.XML表达式以返回我需要的结果?

答案1

第一个选项-name之后就不再起作用了/。一如既往,男人页面是你的朋友:

 -path pattern
         True if the pathname being examined matches pattern.  Special shell pattern matching characters
         (``['', ``]'', ``*'', and ``?'') may be used as part of pattern.  These characters may be
         matched explicitly by escaping them with a backslash (``\'').  Slashes (``/'') are treated as
         normal characters and do not have to be matched explicitly.

我通常更喜欢与 GNU find 兼容,因此使用选项-wholename。请注意,这些也存在于不区分大小写的模式下:-iwholename-ipath

因此,对于你的情况,你应该这样做(记住,全名与所有的路径,因此必须*在开头添加通配符):

karolos$ find basedir -type f
basedir/16xxxx/EX1.XML
basedir/16xxxx/EX2.XML
basedir/16yyyy/EX3.XML
basedir/16yyyy/EX4.XML
karolos$ find basedir -wholename "*16xxxx/*.XML"
basedir/16xxxx/EX1.XML
basedir/16xxxx/EX2.XML

实现您想要的另一种方法是使用 find 结合grep(请注意,我必须改变正则表达式,.在通配符前添加(对于任何字符)*):

karolos$ find basedir | grep '16xxxx/.*.XML'
basedir/16xxxx/EX1.XML
basedir/16xxxx/EX2.XML

最后,根据您的需要,您甚至有可能甚至不需要使用find(如果你不需要额外的灵活性)。然后你可以使用bash 文件名扩展如下:

karolos$ echo basename/*16x*/*XML
basename/16xxxx/EX1.XML basename/16xxxx/EX2.XML

相关内容