我有一些看起来像的文件:
/path/with spaces/{a,b,c}/*.gz
而且我需要在a,b,c
目录子集下与 glob 匹配的所有文件最终作为单个命令的参数:
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 在变量之前扩展了大括号。我尝试过使用 and 甚至 (*shudder*) 的技巧,echo
但ls
很难eval
让它们与文件名中的空格一起使用。 find
似乎没有太大帮助,因为它不做大括号。我可以为数组中的每个目录获取一个单独的 glob:
dirs=( "${dirs[@]/#//path/with spaces/}" )
dirs=( "${dirs[@]/%//*.gz}" )
但随后 bash 在扩展时引用通配符。
那么:有没有一种优雅的方法来获取与变量大括号和 glob 模式匹配的所有文件,正确处理空格,还是我坚持做 for 循环?如果这有所作为,我正在使用 Bash 3。