ディレクトリとファイルで構成される 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" '{}' +
sufx
fileコマンドでを使用しているため、他の種類のファイル(たとえば/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" '{}' +