拡張されたglobを使用しようとしていますが、それをbash -c
機能させる方法が見つかりませんでした。
私が試したこと
bash -c 'for f in *.!(ext); do echo $f; done'
結果:
bash: -c: line 0: syntax error near unexpected token `('
bash -c 'for f in *.!\(ext\); do echo $f; done'
結果:
*.!(ext)
bash -c 'for f in *.!$0; do echo $f; done' '(ext)'
結果:
*.!(ext)
bash -c 'for f in "*.!(ext)"; do echo $f; done'
結果:
*.!(ext)
答え1
で拡張されたグローブモードを使用するには、何らかの方法でシェルオプションを有効にするbash
必要があります。extglob
インラインスクリプトに対してこれを行う最も簡単な方法は、bash -c
コマンドラインでオプションを使用してシェルオプションを設定することです。-O
bash -O extglob -c 'script code here'
直接電話することもできますshopt -s extglob
スクリプト内でただし、シェルがコードを解析する方法を変更するので(シェルの構文を変更する)、この操作が別の行で実行されることを確認する必要があります。
bash -c 'shopt -s extglob
script code here'
文字列で終わらないすべての名前を印刷する実際の操作は次のとおりです.ext
。
bash -O extglob -O dotglob -O nullglob -c 'printf "%s\n" !(*.ext)'
追加の設定dotglob
とnullglob
オプションを使用すると、スクリプトは隠された名前を照合し、一致するものがない場合(拡張されていないパターンを印刷する代わりに)空白行を印刷します。
パターンは (not just) で*.!(ext)
終わるファイル名を除外します。ext
.ext
そしてドットを含まないファイル名。