foldername
またはtest
というatest
フォルダ内のすべてのファイルを一覧表示したいと思いますbtest
。
私の最初の反応はプレーすることでしたls ./foldername/*.{a,b,}test
拡張機能にコンテンツがない場合は正常に動作しますatest
。この場合、エラーが発生しますzsh: no matches found: ./foldername/*.atest
。
このエラーを無視して存在するファイルを印刷する方法はありますか?
zsh と Bash の両方で動作するために必要です。
ベストアンサー1
存在する
ls -d ./foldername/*.{a,b,}test
{a,b,...}
グローバル演算子ではない、これは中括弧拡張であり、まず次に拡張されます。
ls -d ./foldername/*.atest ./foldername/*.btest ./foldername/*.test
各 glob は個別に拡張され、一致しない glob がある場合は、期待どおりにコマンドがキャンセルされますzsh
(またはfish
同様の動作のオプションを取得する必要bash
があります)。failglob
ここでは、これらすべてのファイルと一致する単一のglobを使用し、そのglobがどのファイルとも一致しない場合にのみコマンドをキャンセルしようとします。
ls -d ./foldername/*.(a|b|)test
nullglob
単一のglobマッチがないかのように使用したくなく、ls
引数なしで実行されるため、現在のディレクトリが一覧表示されます。cshnullglob
一致しないglobを削除しますが、すべてのglobが一致しない場合はまだコマンドをキャンセルするので、これに関連してより良いです。
あなたはそれを使用したくないでしょう。なぜなら、それはあなたに恥ずかしいnonomatch
物品の破損行為をもたらすからです。bash
とinの両方で機能するglobの代替案では、zsh
ksh glob(inとin)bash
を使用できます。set -o kshglob
zsh
shopt -s extglob
bash
次に、次の操作を行います。
ls -d ./foldername/*.@(a|b|)test
または:
ls -d ./foldername/*.?([ab])test
矛盾があるときにglobがそのまま渡されるのを防ぐには、このfailglob
オプションを追加してください。bash
ls
バラよりnullglobがデフォルトではないのはなぜですか?より多くの情報を知りたいです。