允许find匹配任意文件

允许find匹配任意文件

我将参数传递给由目录和文件组成的 bash 函数。以下代码在查看数组之前验证参数fdir

declare -A tag
for arg in "$@"; do
  printf '%s\n' "arg: $arg"  
  [[ -d "$arg" || -f "$arg" ]] || continue
  [[ ${tag[$arg]} ]] && continue
  fdir+=("$arg")
  tag[$arg]=1
done

最后,我将 的内容传递fdir给 findcommand并最终head在匹配的文件上运行。

local _GREP="/bin/grep --color"
hn=13
sufx=( \( -name '*.sh' -o -name '*.c' \) )
mxdpt=( -maxdepth 3 )
find "${fdir[@]}" -type f "${sufx[@]}" "${mxdpt[@]}"  \
  -exec head -v -n "$hn" '{}' + 

sufx因为我在 file 命令中使用,如果我传递不同类型的文件(例如/home/flora/file.org),find将找不到匹配项。

一种解决方案是在数组中将目录放在文件之前fdir。循环遍历每个元素并在检测到第一个文件后立即fdir设置。sufx=()

   declare -A tag

   local daggr=()
   for arg in "$@"; do
     [[ ! -d "$arg" ]] || continue
     [[ ${tag[$arg]} ]] && continue
     daggr+=("$arg")
     tag[$arg]=1
   done

   local faggr=()
   for arg in "$@"; do
     [[ ! -f "$arg" ]] && continue
     [[ ${tag[$arg]} ]] && continue
     faggr+=("$arg")
     tag[$arg]=1
   done

   fdir=( "${daggr[@]}" "${faggr[@]}" )

 for (( i=0 ; i < $n ; i++ )); do
   [[ -f "${fdir[$i]}" ]] && { sufx=() ; mxdpt=() ; }
   find "${fdir[$i]}" -type f "${sufx[@]}" "${mxdpt[@]}"  \
     -exec head -v -n "$hn" '{}' +
 done

关于我可以尝试的更好或更简单的方法有什么建议吗?

答案1

首先,你必须引用这个:

sufx=( \( -name '*.sh' -o -name '*.c' \) )

如果find应用于传递目录-exec中的所有文件"${fdir[@]}",但仅应用于传递目录中的某些文件,那么一个简单的方法是进行两次find调用:

find "${fdir[@]}" -maxdepth 0 -type f -exec head -v -n "$hn" '{}' +
find "${fdir[@]}" -mindepth 1 -type f "${sufx[@]}" "${mxdpt[@]}"  \
  -exec head -v -n "$hn" '{}' +

相关内容