我有一些类似于以下格式的文件:
/path/with spaces/{a,b,c}/*.gz
我需要将匹配全局模式的所有文件仅限于 a,b,c
目录子集,作为单个命令的参数:
mycmd '/path/with spaces/a/1.gz' '/path/with spaces/a/2.gz' '/path/with spaces/c/3.gz' ...
我关心的目录通过命令行参数传入,并且它们存储在一个数组中:
dirs=( "$@" )
我想做类似以下的事情:
IFS=,
mycmd "/path/with spaces/{${dirs[*]}}/"*.gz
但这不起作用,因为bash在变量之前扩展花括号。我尝试了使用echo、ls和甚至eval(*发抖*)的技巧,但是很难让它们适用于文件名中带有空格的情况。find似乎没什么帮助,因为它不执行花括号。我可以使用以下方式将每个目录的单独glob存储到数组中:
dirs=( "${dirs[@]/#//path/with spaces/}" )
dirs=( "${dirs[@]/%//*.gz}" )
但是在扩展时,bash会引用通配符。
那么,是否有一种优雅的方法来获取匹配变量大括号和glob模式的所有文件,正确处理空格,或者我只能使用for循环?如果这有区别,我正在使用Bash 3。
xargs
可以同时执行两种操作,但默认情况下会尽可能多地将参数传递给一个命令。你可以自己试一下:seq 10 | xargs echo
。 - Jay Hacker