我正在使用 find 命令在数组 fdir 中存储的目录列表中搜索文件。
find "${fdir[@]}" -type f "${sufx[@]}"
我很开心,所以我可以构造由表达式组成的progl=( ".rc" ".el" ".c" ".f")
数组sufx
-name \*.rc -o -name \*.el -o -name \*.c -o -name \*.f
我怎样才能以方便的方式做到这一点?
使用 grep 命令,我刚刚开始使用
sufx+=( --include=\*.{rc,el,c,f} )
grep -rl "${sufx[@]}" -e "$phrs" -- "${dra[@]}"
建议的策略如下。以下内容可以改进或简化吗?
local progl=( ".rc" ".el" ".c" ".f")
local pextd=( "${progl[@]}" ".cp" ".cpp" ".f90" ".f95" ".f03" ".f08")
local typog=( ".org" ".texi" ".tex")
for ext in "${incl[@]}"; do # include file-type suffixes
if [[ "$ext" == "progl" ]]; then
for ft in $progl; do
sufx+=( -name \*${ft} -o )
done
continue
elif [[ "$ext" == "pextd" ]]; then
for ft in $pextd; do
sufx+=( -name \*${ft} -o )
done
continue
elif [[ "$ext" == "typog" ]]; then
for ft in $typog; do
sufx+=( -name \*${ft} -o )
done
continue
fi
done
答案1
不幸的是,为该命令构建一个有效的参数向量并不容易find
。
尽管grep
命令采用 形式的单个参数--include=\*.rc
,但要执行 中的(某种程度上)等效操作,find
您需要传递两个单独的参数-name
和*.rc
。要将它们或链接起来,您需要第三个参数,-o
所以你可以这样做:
args=()
for progl in rc el c f; do
args+=( -name "*.$progl" -o )
done
导致
$ echo "${args[*]}"
-name *.rc -o -name *.el -o -name *.c -o -name *.f -o
有多种方法可以处理悬垂问题-o
;例如,你可以
unset args[-1]
或者你可以链接一个-false
谓词(因为-o false
永远不会为真)。然后你可以在 find 命令中使用数组,例如
find "${fdir[@]}" -type f \( "${args[@]}" \)