【问题标题】:Find throw paths must precede expression in script查找抛出路径必须在脚本中的表达式之前
【发布时间】:2012-05-29 11:57:55
【问题描述】:

我正在尝试将 find 和 grep 别名为如下所示的一行

alias f='find . -name $1 -type f -exec grep -i $2 '{}' \;'

我打算将它运行为

f *.php function

但是当我将它添加到 .bash_profile 并运行它时,我被击中了

[a@a ~]$ f ss s
find: paths must precede expression
Usage: find [-H] [-L] [-P] [path...] [expression]

我该如何解决这个问题?

【问题讨论】:

    标签: linux bash shell find grep


    【解决方案1】:

    别名不接受位置参数。你需要使用一个函数。

    f () { find . -name "$1" -type f -exec grep -i "$2" '{}' \; ; }
    

    你还需要引用你的一些论点。

    f '*.php' function
    

    这会延迟 glob 的扩展,以便 find 执行它而不是 shell。

    【讨论】:

    • 不走运,我将function f() { find . -name "$1" -type f -print0 | xargs -0 grep -i "$2"; } 添加到 .bash_profile 并获取它。遇到同样的错误[a@a ~]$ f "*.php" function find: paths must precede expression Usage: find [-H] [-L] [-P] [path...] [expression]
    • @QuintinPar:您评论中的函数定义和执行对我来说没有错误。仔细检查以确保您实际尝试的内容与您发布的内容相匹配。另外,尝试declare -f f 显示函数定义以进行验证。此外,使用 () 定义函数时,也不必使用 function 关键字(反之亦然)。 Bash 是少数几个同时接受它们的 shell 之一。
    • @quinton:您需要使用单引号中的第一个参数调用 f 。使用双引号非常不同。
    • @WilliamPursell:仅当存在变量或参数扩展时。用于通配符的双引号和单引号之间没有区别。特殊参数$*$? 与通配符有表面上的相似性,它们将在双引号内展开,除非美元符号被转义(如果您正在寻找一个在其文件中的该位置带有文字美元符号的文件)名称)或规范用单引号括起来。在单引号或双引号的情况下,如果您要查找包含文字星号的文件名,则需要对其进行转义。
    • 上述所有内容也适用于方括号字符列表或范围通配功能。
    【解决方案2】:

    扩展丹尼斯威廉姆森的解决方案:

    f() { find . -name "$1" -type f -print0 | xargs -0 grep -i "$2"; }
    

    使用 xargs 而不是 -exec 可以避免为每个 grep 生成新进程...如果您有很多文件,开销可能会有所不同。

    【讨论】:

    • 对于支持它的 find 版本,您可以使用 + 而不是 \; 来获得相同的效果。
    猜你喜欢
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 2021-07-28
    • 2011-09-23
    • 1970-01-01
    相关资源
    最近更新 更多