次のようなファイルがいくつかあります。
/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
and and ls
and even eval
(*shudder*) でトリックを試しましたが、ファイル名にスペースを使用してそれらを機能させるのは困難です。find
ブレースを行わないため、あまり役に立たないようです。次のようにして、配列内のディレクトリごとに個別のグロブを取得できます。
dirs=( "${dirs[@]/#//path/with spaces/}" )
dirs=( "${dirs[@]/%//*.gz}" )
ただし、bash は展開時にワイルドカードを引用します。
だから:変数ブレースとグロブパターンに一致するすべてのファイルを取得し、スペースを適切に処理するエレガントな方法はありますか、それともforループで立ち往生していますか?それが違いを生む場合、私はBash 3を使用しています。