我将参数传递给由目录和文件组成的 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" '{}' +