ディレクトリに名前に1からNまでの数字を含むすべてのファイルが含まれていることを確認する単純なbashスクリプトを作成したいと思います。
# Creating some files for testing
$ cd /tmp/
$ mkdir test
$ touch test/a01x.dat
$ touch test/b02y.dat
# Display dir contents
$ ls test/*{01,02}*
test/a01x.dat test/b02y.dat
ただし、seq
数値を生成するためにコマンドを使用すると、次のような結果が生成されます。
$ ls test/*{$(seq -s , -f "%02g" 1 2)}*
ls: cannot access 'test/*{01,02}*': No such file or directory
単一引用符で囲まれたパスを介してコマンドを実行すると、ワイルドカードが拡張されないため、間違いなくエラーが発生することがわかります。
$ ls 'test/*{01,02}*'
しかし、私はそれらを使用しませんでした。問題は何ですか?
答え1
問題は、シェルがコマンドの{...,...}
置き換え(部分的に)を実行する$(...)
前に中括弧を拡張(処理)することです。したがって、seq
拡張後、シェルはそれを再計算せずに{01,02}
リテラルとして残します。
eval
コマンド置換を実行した後に式を再評価するには、1つを追加する必要があります。
$ eval "ls test/*{$(seq -s , -f "%02g" 1 2)}*"
この場合、最初にコマンド置換を実行して文字列を生成し、シェルからコマンドとして解釈するように要求し、中かっことグローバル拡張を実行しls test/*{01,02}*
てeval
目的のファイルのリストを生成します。