在下面的代码中,如何将“扩展”部分作为变量?理想的情况是类似
extensions_supported=docx,doc,pdf
。
for file in "$folder/"*.{docx,doc,pdf}; do
process "$file"
done
你可以这样做:
$ folder='tmp'
$ shopt -s extglob
$ extensions_supported='docx|doc|pdf'
$ for file in "$folder/"*.@($extensions_supported); do
echo process "$file"
done
process tmp/bar.doc
process tmp/etc.docx
process tmp/foo.docx
process tmp/that.doc
process tmp/this.pdf
完成测试后删除
echo
。
以上是在此输入上运行的:
$ ls tmp
bad.txt bar.doc etc.docx foo.docx that.doc this.pdf
如果您需要将扩展名作为逗号分隔的字符串,您可以这样做:
extensions_supported="docx,doc,pdf"
# Convert to array
IFS=',' read -ra ext_array <<< "${extensions_supported}"
# Create pattern
ext_pattern=$(IFS=,; echo "{${ext_array[*]}}")
shopt -s nullglob
for file in "${folder}/"*${ext_pattern}; do
[[ -f "${file}" ]] && process "${file}"
done
如果没有文件匹配,
nullglob
会阻止循环运行。但请注意,这会添加不必要的(通常)步骤,您需要处理逗号分隔的字符串。如果您可以仅用空格替换 ,
,那么代码就会更少。最后,如果你可以使用 find
工具和空格,那将几乎是一行:)
extensions="docx doc pdf"
for file in $(find "${folder}" -type f \( -name "*.${extensions// / -o -name "*.}" \) ); do
process "${file}"
done
-o
是 OR
中的 find
运算符。
提示:我建议您始终使用
${variable}
语法,而不仅仅是 $variable
- 这为变量处理添加了一些额外的功能。