web-dev-qa-db-ja.com

シェルグロブの「または」

ファイル名に部分文字列「s1r」、「s2r」、「s3r」、または「s19r」を含むファイルをlsしたいと思います。

もうすぐです!

失敗した試み:

ls *s[123][9?]r*

上記は私に部分文字列を含むファイルのみを与えます

s19r

一方

ls *s[1-3]|[19]r*

戻り値

-bash:[19] r *:コマンドが見つかりません

ls:* s [1-3]:そのようなファイルまたはディレクトリはありません

つまり、または|を認識しません。演算子-パイプにも使用されるため、これは理にかなっています。

「s1r」、「s2r」、「s3r」または「s19r」を含むファイルを見つけるにはどうすればよいですか?

6
The Unfun Cat

使用する ls *s1r* *s2r* *s3r* *s19r*

存在しないファイルが気になる場合は、nullglobオプションを設定できます。

          nullglob
                  If  set,  bash allows patterns which match no files (see
                  Pathname Expansion above) to expand to  a  null  string,
                  rather than themselves.

シェルがbashでない場合は、おそらく同様の方法があります。マニュアルページをご覧ください。

6
michas

あなたはこれを試してみたいかもしれません:

ls *s?([123])r* *s19r*

例えば

次のファイルを含むディレクトリがあります。

% ls | column
s10r    s12r    s14r    s16r    s18r    s1r s2r s4r s6r s8r
s11r    s13r    s15r    s17r    s19r    s23r    s3r s5r s7r s9r

上記のlsを使用する:

% ls *s?([123])r* *s19r*
s19r  s1r  s2r  s3r

詳細については、 パターンマッチングに関するbashマニュアル を参照してください。

1
slm