2016-05-28 8 views
1

OSXでバージョン4.3.42を使用しているbashのマニュアルには、縦棒 '|'文字は、ファイルグロビングで複数のファイルパターンの区切り文字として使用されます。したがって、以下は私のシステム上で動作するはずです:bashファイルグロビング異常

projectFiles=./config/**/*|./support/**/* 

しかし、第二のパターンは、パターンがprojectFilesに分解されることはありませんので、そのディレクトリ構造内にある最後のファイルの「アクセス許可が拒否されました」を与えます。私は、括弧内のパターンを包むなど、マニュアルにレイアウトされている

projectFiles=(./config/**/*)|(./support/**/*) 

をこの上のバリエーションを試してみたが、それはどちらか動作しません。

私が間違っていることに関する提案はありますか?

+3

マニュアルの関連部分をリンクすることはできますか?シェルスクリプトで '|'はプログラム間のパイプラインです。 "許可が拒否されました"というエラーは、 './support/**/*'が解決するものを実行しようとしたことによるものです。 –

+1

また、単純な割り当ての間にグロビングは* *実行されません。 'foo = *'を試してから、 'echo" $ foo "'と 'echo $ foo'を比較してください。 *配列*代入中にグローブが発生します。 'foo =(*)'を見てください; echo "$ {foo [@]}" ' – chepner

+1

extglob、 './ {config、support}/**/*'なしでこれを行うことができます。これは、configを持つパスとサポートスペースを区切ったパスに展開し、パターンマッチングを行います。または./@(config | support)/ **/* 'とextglobを指定します。いずれかの方がきれいです。 – BroSlow

答えて

6

おそらくman bashにこの部分に言及している:

If the extglob shell option is enabled using the shopt builtin, several 
    extended pattern matching operators are recognized. In the following 
    description, a pattern-list is a list of one or more patterns separated 
    by a |. Composite patterns may be formed using one or more of the fol- 
    lowing sub-patterns: 

      ?(pattern-list) 
       Matches zero or one occurrence of the given patterns 
      *(pattern-list) 
       Matches zero or more occurrences of the given patterns 
      +(pattern-list) 
       Matches one or more occurrences of the given patterns 
      @(pattern-list) 
       Matches one of the given patterns 
      !(pattern-list) 
       Matches anything except one of the given patterns 

|セパレータは説明したように、しかしextglobが有効になっている場合にのみ、パターンリストに動作します:

shopt -s extglob 

試用:

あなたは extglobせずにこれを行うことができます

注意、./{config,support}/**/*、ちょうど区切りの設定で、パスとサポートスペースでのパスに展開して、パターンマッチングを行うだろう:@BroSlowとして

はコメントで指摘しました。または./@(config|support)/**/*extglob。いずれかの方がきれいです。

@chepnerさんのコメントにも言及する価値がある:

また、単純な代入の間に全く行われていないグロブ。 foo=*を試してからecho "$foo"echo $fooを比較してください。アレイの割り当て中にグローブが発生する。 foo=(*); echo "${foo[@]}"

+0

ありがとうございました。@ janos ...カップルのもの: 1)projectFiles = *(./config/ **/* |。/ support/**/*)が動作しませんでした。 'ls $ projectFiles'を実行すると" No such file or directory "となります。 2)echo $ fooはファイルglobbingを行います。echo" $ foo "は '*'を返します - 違いを指摘する良い例 – JESii

+0

そしてyes。 ..それは私の注意を引いた男のbashのセクションだった – JESii

+0

...あなたの他の2つのオプション - ./{config,support}/**/* and ./@(config|support)/**/* - どちらも動作します。あなたとBroSlowと組み合わせられた答えのためのchepnerに感謝します! – JESii