このファイルツリーがあります。
a.py
b/c.py
Bashではls -l **/*.py
与えられた
b/c.py
Zshではls -l **/*.py
良い
a.py
b/c.py
これを防ぐためにbashの動作を変更する方法はありますかls *.py **/*.py
?
PS:私は使用しましたが、ls
問題はすべてのコマンドにあります。
答え1
通常のshおよび通常のsh以前のバージョンと互換性のあるシェルでは、モードと**
は*
同じです。 Zshはいくつかの方法でshの互換性から外れます。その一つはモード**/
と***/
タスクです。再帰ワイルドカード。**/…
現在のディレクトリ、そのサブディレクトリ、サブサブディレクトリなどを検索する***/…
だけでなく、サブディレクトリへのシンボリックリンクも通過します。
Bash ≥4.3で同様の機能を有効にできます。shopt -s globstar
、ksh93でset -o globstar
/とset -G
。その他の関連オプションは次のとおりです。
shopt -s dotglob
ワイルドカードパターンがドットファイルと一致するようにします(zshのset -o dotglob
/に似ていますglobdots
)。GLOBIGNORE
変数を設定すると、bash
このオプションも自動的に有効になります。- ksh93を使用すると、同様の効果が得られます
FIGNORE=.:..
。 - zshでは、
(D)
ケースごとにパターンに応じてglob修飾子を使用してこれを実行できます。 Bash/ksh93には同様の機能はありません。
shopt -s extglob
ksh88スタイル拡張glob演算子(set -o kshglob
zshに似ています)を有効にします(kshでは常に有効です)。- zshはまた、
set -o extendedglob
他の構文で任意の正規表現(否定演算子を使用)を表す代替方法も提供します。 Bashにはこの構文に対応する構文はありません。
- zshはまた、
shopt -s nocaseglob
set -o nocaseglob
パターンマッチングを大文字と小文字を区別しないようにします(zshの/に似ていますset +o caseglob
)。- zshでは、パターンプレフィックスを付けてケースごとに実行できます
(#i)
。同様に、ksh93ではパターンプレフィックスを付けることができます~(i)
。 Bashには同様の機能はありません。
- zshでは、パターンプレフィックスを付けてケースごとに実行できます
shopt -s nullglob
一致するファイルがない場合は、パターンを変更せずに残すのではなく、globパターンは空のリストに展開されます(set -o nullglob
zshに似ています)。- zshでは、
(N)
パターンに応じてglob修飾子を使用してケースごとにこれを実行できます。 ksh93では、~(N)
モードが前に来ます。 Bashには同様の機能はありません。
- zshでは、
shopt -s failglob
パターンを変更せずにそのままにするのではなく、一致するファイルがない場合はエラーをトリガーします(zshのデフォルト動作)。set -o globstarshort
たとえば、.inに似ていますが(拡張子に含まれていることを除いて)同じようにzsh
書くこともできます。**
**/*
**/*.py
**.py
bash -O globstar
**
**/*
dir/**
dir/
**.py
*.py
Bash 4.0ではこのglobstar
オプションと**
モードを導入しましたが、bash 4.3以前は常にディレクトリのシンボリックリンクを巡回しましたが、5.0以前はディレクトリのシンボリックリンクを巡回しました。一部シンボリックリンク。 Bash 3.x以下にはそのような機能はありません。
tcsh
同様の形式の再帰ワイルドカードを、yash
およびシェルでも使用できますfish
(デフォルトでは有効ではありません)。
.
¹これらのシェルと..
特別なディレクトリの間にわずかな違いがあることに注意してください。これらはzsh
globによって拡張されず、設定はksh93のglobから除外されますが、bashではEven withFIGNORE=.:..
のようにglobから除外されますが。設定は役に立ちますが、そうではありません。*
dotglob
.*
GLOBIGNORE=.:..
.*
dir/.*
.*/file