列出与文件类型匹配的特定文件

列出与文件类型匹配的特定文件

我正在使用 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[@]}" \)

相关内容