我在 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.XML
和EX2.XML
(为了清楚起见,排除完整路径名)。
这是在 BASH 脚本的上下文中,如果我可以输入要传递给命令的16xxxx/*.XML
表达式,将会很方便:-name
find
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