찾기가 모든 파일과 일치하도록 허용

찾기가 모든 파일과 일치하도록 허용

디렉터리와 파일로 구성된 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에 전달 하면 일치하는 파일에서 실행 command됩니다 .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" '{}' + 

sufxfile 명령에서 을 사용하고 있기 때문에 다른 유형의 파일(예: /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" '{}' +

관련 정보