zshのアスタリスク「*」がbashと同じ動作を持つようにするにはどうすればよいですか?

zshのアスタリスク「*」がbashと同じ動作を持つようにするにはどうすればよいですか?

最近bashからzshに切り替えましたが、今すぐ入力すると

ls *

単にディレクトリ内のすべてのファイルを一覧表示するのではなく、2段階のツリーを表示します。

返品

rm -rf somepath/*

出力失敗zsh: no matches found:

これはbashでうまくいきました。誰でもこの動作を復元するのに役立ちますか?

oh-my-zshをインストールしました。

答え1

ls *Bashでも同じ効果があります。シェルに関係なく、シェルは最初にワイルドカードを展開してから、拡張結果をコマンドに渡します。たとえば、現在のディレクトリに4つのエントリ(サブディレクトリ2つ、dir1一般dir2ファイル2つ、およびfile1)が含まれているとしますfile2。それからシェルls *ls dir1 dir2 file1 file2。このlsコマンドは、まず既存のディレクトリのパラメータ名をリストし、次に各ディレクトリの内容を順番にリストします。

$ ls
dir1  dir2  file1  file2
$ ls -F
dir1/  dir2/  file1  file2
$ ls *
file1  file2

dir1:

dir2:

lsBashで動作が異なる場合は、次のいずれかを実行できます。bash設定が変更されました。ワイルドカード拡張をオフにすると、どこでもオフになります。または、コマンドの意味を変更してlsディレクトリのリストを表示しません(エイリアスが有効)。具体的には次のようなものがあります。

alias ls='ls -d'

あなたの場合、~/.bashrcあなたが説明する効果を得るでしょう。これがあなたがやっていることであれば、この行をコピーすると~/.zshrc同じ効果が得られます。


実際、rm -rf somepath/*bashとzshが空のディレクトリのときに現れる効果はsomepathまったく異なります。

Bashにsomepath/*一致するファイルがない場合、bashはコマンドにワイルドカードパターンを保持するため、パラメータとがrm表示されます。ディレクトリに呼び出されたファイルを削除しようとしましたが、そのファイルがないため、この試行は失敗します。オプションをに渡すと、ファイルの欠落について文句を言うことはありません。-rfsomepath/*rm*somepath-frm

zshでは、デフォルトでワイルドカードがどのファイルとも一致しない場合、zshはそれをエラーとして扱います。このオプションをオフにしてzshの動作方法を変更できますnomatch:

setopt no_nomatch

ワイルドカードが一致しない場合にシェルに通知することは通常、コマンドラインでより良い動作であるため、この方法はお勧めできません。この場合、空のリストが大丈夫だとzshに知らせるより良い方法があります。

rm -rf somepath/*(N)

Nグローバル予選つまり、ワイルドカードがファイルと一致しない場合は空のリストに展開されます。

答え2

デフォルト以外のオプションを使用してBourne Againシェルを設定しましたnullglob。これはls *空のディレクトリを通常のディレクトリにlsし、rm -rf somepath/*サブディレクトリを空にしますrm -rf

Zシェルを使用して同じ効果を得るには、同じ名前の同様のデフォルト以外のオプションが必要です。

setopt ヌルグローブ

Zシェルには少し異なる動作を有効にする別のオプションがあります。

setopt cshnullglob
このオプションを使用するとls *rm -rf somepath/*まだ一致エラーとして表示されますが、無視rm -rf empty/* hasfiles/*されずempty/*に転送されませんrm。それを可能にする一部モードはNoneに拡張されます。最後のもの確かに。

関連情報