glob *.{a,b,}test で中括弧拡張を使用する場合、zsh では「一致しない」を無視します。

glob *.{a,b,}test で中括弧拡張を使用する場合、zsh では「一致しない」を無視します。

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の代替案では、zshksh glob(inとin)bashを使用できます。set -o kshglobzshshopt -s extglobbash

次に、次の操作を行います。

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

または:

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

矛盾があるときにglobがそのまま渡されるのを防ぐには、このfailglobオプションを追加してください。bashls

バラよりnullglobがデフォルトではないのはなぜですか?より多くの情報を知りたいです。

答え2

次のことをお勧めしますfind

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

答え3

私はこの問題に直面し、まずls自体をハックして解決しました。この作業を終えた後、必要なのは単純なCプログラムだけであることに気づきました。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc, char* argv[]) {
  struct stat statbuf;
  int i;
  for( i=1; i<argc; i++ ) {
    if( stat(argv[i],&statbuf) == 0 ) {
      printf("%s\n",argv[i]);
    }
  }
}

これと必要な作業はすべて、コマンドライン引数を実行し、有効なファイル(たとえば、stat()が成功したファイル)に対応する文字列を再エコーすることです。

もちろん、同じ単純なPython、Perl、またはstatを実行するシェル関数を使用してそれらをシミュレートできますが、Cで書くとはるかに速く実行されます。

lsハッキングについては私の個人的なwikiで実行しました。http://linux.chalisque.net/LsIgnoreMissing

答え4

@DopeGhotiのコメントが私にとって効果的でした。

つまり、次のように演算子を/dev/null使用するようにエラーをリダイレクトします。2>

ls ./foldername/*.{a,b,}test 2> /dev/null

関連情報