foldername
、test
、またはatest
の拡張子が付いたbtest
という名前のフォルダー内のすべてのファイルを一覧表示します。
私の当面の考えはls ./foldername/*.{a,b,}test
を実行することでした
これは、拡張子atest
がない場合を除き、正常に機能します。この場合、エラーzsh: no matches found: ./foldername/*.atest
が発生します。
このエラーを無視して、存在するファイルを印刷する方法はありますか?
これはZSHとBASHの両方で機能するために必要です。
find
でこれを行うのが最善の場合があります。
find ./foldername -maxdepth 1 -name '*.atest' -o -name '*.btest' -o -name '*.test'
に
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
の動作がおかしくなり、残念なことになるからです。
zsh
とbash
の両方で機能する代替globの場合、ksh globs(set -o kshglob
in zsh
およびshopt -s extglob
in bash
)。
次に、あなたはやります:
ls -d ./foldername/*.@(a|b|)test
または:
ls -d ./foldername/*.?([ab])test
failglob
にbash
オプションを追加して、グロブが一致しないときにls
に文字通り渡されないようにします。
詳細は nullglobがデフォルトではないのはなぜですか? を参照してください。