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
$PATH
find
find "$@"
#!/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}"
- ...后面跟着两个新的参数:
-regextype
和posix-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
。这两个是我最常使用但出现问题的两个选项。