如何在文件循环中将扩展名指定为变量?

问题描述 投票:0回答:2

在下面的代码中,如何将“扩展”部分作为变量?理想的情况是类似

extensions_supported=docx,doc,pdf

for file in "$folder/"*.{docx,doc,pdf}; do
    process "$file"
done
bash
2个回答
1
投票

你可以这样做:

$ 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

0
投票

如果您需要将扩展名作为逗号分隔的字符串,您可以这样做:

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
- 这为变量处理添加了一些额外的功能。

© www.soinside.com 2019 - 2024. All rights reserved.