一致しないグロブパターンから空の文字列を静かに取得する方法


24

3つのファイルがあるフォルダーがあるとします。

foo1
foo2
bar

1. 実行した場合

list_of_files=$(print foo*)
echo $list_of_files

私は得る: foo1 foo2

2.実行した場合

list_of_files=$(print bar*)
echo $list_of_files

私は得る: bar

3.ただし、実行した場合

list_of_files=$(print other*)
echo $list_of_files

私は得る:(zsh: no matches found: other*変数$list_of_filesは空ですが)


それがグロブ展開と一致しない場合に文句を言わないようにzshに依頼する方法はありますか?

私の目標は、上記のメカニズムを使用して、指定されたglobパターンに一致するファイルのリストを静かに収集することです。

回答:


33

glob修飾子を使用null_globして、パターンのオプションをオンにしますN

list_of_files=(*(N))

スクリプトまたは関数のすべてのパターンでこれを行う場合、null_globオプションをオンにします。

setopt null_glob

この答えにはbashとkshに相当するものがあります。

printまたはコマンドの置換を使用しないでください!これにより、文字列のリストではなく、ファイル名とその間にスペースを含む文字列が生成されます。(参照してくださいなぜそれがシェルプログラミングで重要なのですか?単語の分割とは何ですか?


15

より良い方法:for a in *(.N); do ... ; done。Nオプションを使用すると、zshは空のリストをforに配信し、forは0回反復します。

気をつけてくださいls *.foo(.N)。lsは、空の引数リストを受け取ると、ファイルをリストせずにすべてのファイルをリストします。これが、NULL_GLOB(またはそれに相当するbash)が好きではない理由です。すべてのグロブを変更、たとえばlsへの呼び出しを簡単に中断します。


ここであなたの答えを見てファンシー@arnt、これはちょうど私が必要なものです。
GTD

なぜ.(.N)?他の回答には(N)それ自体がありますが、違いは何ですか?
マイケルドースト

問題はファイルに関するものであり、ファイル.のみに一致するようにグロブを制限します。
到着

4

私はあなたがNULL_GLOBオプションを探していると思う:

   NULL_GLOB (-G)
          If a pattern for filename generation has no matches, delete  the
          pattern  from  the  argument list instead of reporting an error.
          Overrides NOMATCH.

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.