永久设置 `find` regextype

永久设置 `find` regextype

GNU 查找允许通过选项使用不同的正则表达式格式-regextype,但据我所知,我-regextype <whatever>每次都必须输入,这很繁重。

如果想要不同的正则表达式风格,则很可能总是想要它,而不是切换每个命令使用的类型。理想的做法是通过首选项文件 ( ~/.find_profile) 或环境变量 ( $FIND_OPTS) 设置首选的正则表达式风格,但我没有发现任何迹象表明这是可行的。

我怎样才能永久设置regextype

答案1

我还没有对此进行大量测试,但它似乎有效。它将参数列表拆分开find并将参数重新连接到另一个参数列表中,但会将其插入到它找到的任何参数-regextype posix-awk前面。-iregex-regex

以这种方式操作 shell 中的参数列表有时无法正确处理某些引用结构,但是在大多数情况下应该可以正常工作。

只需将此函数放入~/.bashrc您运行的任何 shell 的 rc 文件中即可。

find ()
{
    args=
    for arg in $*
    do
        case $arg in
            -iregex|-regex)
                args="$args -regextype posix-awk $arg"
                ;;
            *)
                args="$args $arg"
                ;;
        esac
    done
    set -f
    command find $args
    set +f
}

答案2

就空格而言,这个答案应该相当安全。但也许它是bash特定的?

它插入到第一个或的-regextype posix-extended前面。将其保存在您的某个位置。并且,如果您将其另存为,请确保编辑最后一行(),否则它将在无限循环中调用自身-iregex-regex$PATHfindfind "$@"

#!/bin/bash
for ((i=1; i<= $#; ++i )) {
    if [[ "-iregex" = "${@:i:1}" ]]; then
        set -- "${@:1:i-1}" "-regextype" "posix-extended" "${@:i}"
        break
    fi
    if [[  "-regex" = "${@:i:1}" ]]; then
        set -- "${@:1:i-1}" "-regextype" "posix-extended" "${@:i}"
        break
    fi
    if [[ "--" = "${@:i:1}" ]]; then
        break
    fi
}
find "$@"

我从这里了解到了set --作为编辑命令行参数的一种方法:来自:https://stackoverflow.com/questions/4827690/change-a-command-line-argument-bash

例如,如果第四个参数是-regex,那么i就是 4,新的命令行参数集应该是:

  • 前三个原始参数:"${@:1:i-1}"
  • ...后面跟着两个新的参数:-regextypeposix-extended
  • ...接着是第四个及后续参数:"${@:i}"

答案3

使用别名forfind允许自动设置 regextype,但限制其他可用的语法:

alias find='find -regextype <whatever>'

问题是,现在 find 的许多可选参数无法使用,因为它们-regextype必须是 find 命令块的一部分[expression]

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

使用上述别名,尝试使用符号链接、调试和优化选项会出现错误:find: unknown predicate '-<whatever>'指定路径也是如此:find: paths must precede expression: <wherever>。所有这些选项都是可选的,因此 find 仍然有效,但限制较多。

答案4

我想要一个相当强大的解决方案,其行为就像find实际被调用一样。但我对 bash 特定的代码没有意见。以下是我想出的方案。

function __supports_local_dash {
    local - 2> /dev/null
}

if __supports_local_dash; then
    function find {
        {
            local -
            set +xe
        } 2> /dev/null

        local -a ARGS
        for i in "$@"; do
            if [[ $i =~ -i?regex ]]; then
                ARGS+=(-regextype posix-extended)
            elif [[ $i = -regextype ]]; then
                ARGS=("$@")
                break
            fi

            ARGS+=("$i")
        done

        command find "${ARGS[@]}"
    }

    export -f find
else
    echo "WARNING: Version of bash is too old for find shim. Upgrade to >=4.4." 2> /dev/null
fi

我怀疑该行中还有更多要禁用的 shell 选项set +xe。这两个是我最常使用但出现问题的两个选项。

相关内容