for循环用于可变多重扩展

pep*_*ico 2 bash shell glob

如何改变这个:

for file in "$arg"/*.{jpg,jpeg,png} ; do
    echo "$file" > z.txt
done
Run Code Online (Sandbox Code Playgroud)

至:

for file in "$arg1"/*.{$arg2} ; do
    echo "$file" > z.txt
done
Run Code Online (Sandbox Code Playgroud)

因为我将扩展列表作为单个(逗号分隔)参数.上述尝试不起作用.

che*_*ner 6

使用数组存储扩展,然后遍历数组.

IFS=, read -a extensions <<< "$arg2"
for ext in "${extensions[@]}"; do
  for file in "$arg"/*."$ext"; do
      echo "$file" > z.txt
  done
done
Run Code Online (Sandbox Code Playgroud)


anu*_*ava 6

您可以使用extglob这样传递管道分隔的扩展名列表:

arg2='jpg|jpeg|png'
shopt -s extglob nullglob

for file in "$arg"/*.@($arg2); do
    echo "$file"
done > z.txt
Run Code Online (Sandbox Code Playgroud)

或者,如果要保留逗号分隔的参数,则使用bash替换将逗号替换为管道作为此脚本:

arg2='jpg,jpeg,png'
shopt -s extglob nullglob

for file in "$arg"/*.@(${arg2//,/|}); do
    echo "$file"
done > z.txt
Run Code Online (Sandbox Code Playgroud)