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


8

と呼ばれるフォルダ内のfoldername、拡張子がtestatestまたはのすべてのファイルを一覧表示しますbtest

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

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

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

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


3
標準エラーを/dev/null
DopeGhoti

回答:


9

これを使ってこれを行うのが最善かもしれませんfind

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

1
おそらくを使用して-maxdepth 1ls動作をより厳密にエミュレートします
ジェフシャラー

4
@JeffSchaller、これ-maxdepthはGNU拡張機能であることに注意してください。グロブと3つのその他の相違点に注意してください:find隠しファイルではなく、ソートリストが含まれ、バイトが(のような有効な文字を形成していない含まれているファイル名と一致するように失敗していました$'St\xe9phane.atest'UTF-8ロケールで)
ステファンChazelas

11

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

{a,b,...} はglob演算子ではありません。これはブレース展開であり、最初に次のように展開されます。

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

そして、各グロブは個別に展開され、いずれかのグロブが一致しない場合、コマンドは期待どおりにキャンセルされますzsh(またはfish;ではbashfailglob同様の動作を行うためのオプションが必要です)。

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

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

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

を使用するのは望ましくありません。これはnonomatchbashその動作が壊れてしまうのが残念であるためです。

両方で動作グロブ代替のためにzshbash、あなたは(kshのグロブを使用することができますset -o kshglobzshし、shopt -s extglobbash)。

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

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

または:

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

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

参照してくださいなぜnullglobがデフォルトではないでしょうか?詳細については。


なぜそれがOPの要件であるのかはわかりませんが、bashとzshの両方でこのために機能するextglobはありますか??(...)または+(...)bash を使用する必要がありました。
ジェフシャラー

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