我在 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.XML和EX2.XML(为清楚起见,排除了完整路径名)。
这是一个bash脚本这将使它方便,如果我能进入的背景下16xxxx/*.XML作为表达式传递给-name在find命令:
find basedir -name '16xxxx/*.XML'
Run Code Online (Sandbox Code Playgroud)
但是,这不会返回任何匹配项,因为 shell 与/字符不匹配。是否有一些参数要传递给find或一种方法来转义16xxxx/\*.XML将返回我需要的结果的表达式?
该-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)
| 归档时间: |
|
| 查看次数: |
3712 次 |
| 最近记录: |