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

1 bash find macos

我在 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
Run Code Online (Sandbox Code Playgroud)

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

这是一个bash脚本这将使它方便,如果我能进入的背景下16xxxx/*.XML作为表达式传递给-namefind命令:

find basedir -name '16xxxx/*.XML'
Run Code Online (Sandbox Code Playgroud)

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

Kar*_*los 5

-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.
Run Code Online (Sandbox Code Playgroud)

我通常更喜欢与 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
Run Code Online (Sandbox Code Playgroud)

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

karolos$ find basedir | grep '16xxxx/.*.XML'
basedir/16xxxx/EX1.XML
basedir/16xxxx/EX2.XML
Run Code Online (Sandbox Code Playgroud)

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

karolos$ echo basename/*16x*/*XML
basename/16xxxx/EX1.XML basename/16xxxx/EX2.XML
Run Code Online (Sandbox Code Playgroud)