【问题标题】:Globbing in find command查找命令中的通配符
【发布时间】:2014-05-04 10:50:03
【问题描述】:

我有一个 Android 项目,其中我有 strings.xml 和其他 .xml 文件,根据语言和其他标准在不同的地方定义。

有像 -

> /res/values-en-rUS/strings.xml 
> /res/values-es-rUS/strings.xml
> /res/values-fi/strings.xml 
> /res/values-it/strings.xml
> /res/values-ms/strings.xml 
> /res/values-bn/strings.xml
> /res/values-da/strings.xml
> /overlay_dir/TN_KOR_COMMON/res/values/strings.xml
> /overlay_dir/TN_KOR_COMMON/res/values-en-rUS/strings.xml
> /overlay_dir/TN_KOR_COMMON/res/values-ko/strings.xml
> /overlay_dir/TN_JPN_COMMON/res/values-ja/strings.xml
> /res/layout/hovering.xml
> /res/xml/settings_menu.xml

现在,我只想在具有/res/values-en-rUS 和/res/xml 等路径的目录中的文件中查找字符串。
我使用了命令 -

grep -i "hovering_msg" `find -path "*@(values-en-rUS|xml)*" -iname "*.xml"`

但它似乎不起作用。根据我的理解,*@(values-en-rUS|xml)*" 表示查找多个字符,然后是 values-en-rUS 或 xml,然后是任意数量的字符。谁能告诉我哪里出错了?

【问题讨论】:

  • 你有哪个外壳?重击?
  • @Kent 是的,shell 是 bash。

标签: regex grep find glob


【解决方案1】:

我假设您在 bash 环境中工作。 你已经使用了extend globbing,所以你必须先打开它:

shopt -s extglob

对于您的任务,您不必将grep 和find 结合起来,您可以这样做:

grep -i 'pattern' /res/@(values-en-rUS|xml)/*.xml

对于源代码搜索,我推荐 ag (silver searcher)。

【讨论】:

  • 这没有给我任何匹配。
  • @yadav_vishal 它在这里工作,与 bash ......我只是给它一个测试。 :) 你先执行了shopt -s extglob,不是吗?
  • 是的,我做到了,这不是我想要的,但是当我在 /res/@.... 之前给出了一些路径时,比如 - grep -i 'pattern' /..../. ../res/@(values-en-rUS|xml)/*.xml,它给了我一些匹配。
  • 我看了 here,但仍然对模式和 glob 感到困惑,如果您能指出一些参考资料会很有帮助。
  • 你需要让grep 知道它应该扫描哪个目录。比如说,如果你有/foo/bar/res/yourproject,你给/foo/bar/res/@(....)/*.xml grep 从/foo/bar/res/ 开始,如果你通过cd /foo/bar/res 转到res/,让它成为你当前的目录,你可以grep 'xyz' @(value...|xml)/*.xml。我认为这是非常基本的东西。我不确定这是否能回答你的问题。 @yadav_vishal
【解决方案2】:

使用-path 或-regex 与目录部分进行模式匹配也是可能的,但仅指定两个目标目录比尝试匹配模式更简单。这将节省执行时间,因为它不会尝试搜索其他目录中的文件。

find /res/values-en-rUS /res/xml -iname '*.xml'

grep:

grep -i "hovering_msg" `find /res/values-en-rUS /res/xml -iname '*.xml'`

除了带反引号的命令替换的 splittng 输出之外,还可以使用管道中的while read 来允许文件名中包含空格:

find /res/values-en-rUS /res/xml -iname '*.xml' | while read file; do
    grep -i "hovering_msg" "$file"
done

如果您使用的是 Linux 机器,使用 xargs 会是更好的选择:

find /res/values-en-rUS /res/xml -iname '*.xml' -print0 | xargs -0 -d '\n' -- grep -i "hovering_msg" --

【讨论】:

  • 他说他想在“android project”上做点什么,而不是在一个 android 盒子上。 :-)
  • @konsolebox 该项目存在于我的 linux 机器中,shell 是 bash。此外,我不仅有 2 个这样的模式(values-en-rUS 和 xml),还有更多。
  • @konsolebox /values-en-rUS 和 /xml 不是绝对路径,它们是路径中的模式,因此我使用了 globbing。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多