web-dev-qa-db-ja.com

lsは「一致なし」を無視します

foldernametest、またはatestの拡張子が付いたbtestという名前のフォルダー内のすべてのファイルを一覧表示します。

私の当面の考えはls ./foldername/*.{a,b,}testを実行することでした

これは、拡張子atestがない場合を除き、正常に機能します。この場合、エラーzsh: no matches found: ./foldername/*.atestが発生します。

このエラーを無視して、存在するファイルを印刷する方法はありますか?

これはZSHとBASHの両方で機能するために必要です。

8

findでこれを行うのが最善の場合があります。

find ./foldername -maxdepth 1 -name '*.atest' -o -name '*.btest' -o -name '*.test'
9
John Moon

ls -d ./foldername/*.{a,b,}test

{a,b,...}はglob演算子ではありません。中括弧展開です。最初に展開されます。

ls -d ./foldername/*.atest ./foldername/*.btest ./foldername/*.test

そして、各グロブは個別に展開され、一致しないグロブがある場合、コマンドはzsh(またはfish; bashで期待どおりにキャンセルされます) failglobオプションを使用して同様の動作を実現します)。

ここでは、それらすべてのファイルに一致する単一のグロブを使用し、その1つのグロブがどのファイルにも一致しなかった場合にのみコマンドをキャンセルします。

ls -d ./foldername/*.(a|b|)test

nullglobを使用したくない場合は、どのグロブも一致しない場合、引数なしでlsを実行するため、現在のディレクトリをリストします。 cshnullglobは、一致しないグロブを削除しますが、すべてのグロブが一致しない場合はコマンドをキャンセルするため、この点で優れています。

nonomatchを使用したくないのは、それがbashの動作がおかしくなり、残念なことになるからです。

zshbashの両方で機能する代替globの場合、ksh globs(set -o kshglob in zshおよびshopt -s extglob in bash)。

次に、あなたはやります:

ls -d ./foldername/*.@(a|b|)test

または:

ls -d ./foldername/*.?([ab])test

failglobbashオプションを追加して、グロブが一致しないときにlsに文字通り渡されないようにします。

詳細は nullglobがデフォルトではないのはなぜですか? を参照してください。

11