使用eval
容易出错,这包括在处理具有其他人选择的名称的文件时引入安全漏洞。不要这样做。(除了一般的警告——扩展为正在运行的命令的foo{1..3}
三个单独的参数foo1
,foo2
, 和参数传递给即使没有)。foo3
find
-name
find -name
eval
eval
与您的第一个命令的非基于等效项是:
args=( )
for ((i=nr1; i<=nr2; i++)); do
args+=( abc*_"$i"* )
done
ls "${args[@]}"
对于第二个命令,您最终会得到更接近于:
find_args=( )
for ((i=nr1; i<=nr2; i++)); do
find_args+=( -name "abc*_${i}*" -o )
done
find path/to/folder '(' "${find_args[@]}" -false ')' -print
请注意,用于填充存储在数组中的参数流中-false
最后一个的右侧。-o
-name foo -o name bar -o name baz
find_args
但是,在这两种情况下,您都会冒着在大范围的命令行上耗尽空间的风险(使用原始代码也有风险!)。我建议在运行操作后find
过滤数字范围:
digits_re='_([[:digit:]]+)([^[:digit:]]|$)'
while IFS= read -r -d '' filename; do
dirname=${filename%/*}
basename=${filename##*/}
if [[ $basename =~ $digits_re ]]; then
number=${BASH_REMATCH[1]}
if (( number >= nr1 && number <= nr2 )); then
printf '%q\n' "$filename" # for human consumption
# use '%s\0' instead for a NUL-delimited stream for programmatic use.
fi
fi
done < <(find path/to/folder -name 'abc*_[[:digit:]]*' -print0)