検索がすべてのファイルと一致することを許可する

検索がすべてのファイルと一致することを許可する

ディレクトリとファイルで構成される 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最後に、コンテンツをfindに渡すと、一致するファイルで実行されますcommandhead

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" '{}' + 

sufxfileコマンドでを使用しているため、他の種類のファイル(たとえば/home/flora/file.org)を渡すとfind一致するものが見つかりません。

1つの解決策は、配列のファイルの前にディレクトリを置くことです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[@]}"れたディレクトリ内の一部のファイルにのみ適用される場合、簡単なアプローチは2つの呼び出しを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" '{}' +

関連情報