最近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:
…
ls
Bashで動作が異なる場合は、次のいずれかを実行できます。bash設定が変更されました。ワイルドカード拡張をオフにすると、どこでもオフになります。または、コマンドの意味を変更してls
ディレクトリのリストを表示しません(エイリアスが有効)。具体的には次のようなものがあります。
alias ls='ls -d'
あなたの場合、~/.bashrc
あなたが説明する効果を得るでしょう。これがあなたがやっていることであれば、この行をコピーすると~/.zshrc
同じ効果が得られます。
実際、rm -rf somepath/*
bashとzshが空のディレクトリのときに現れる効果はsomepath
まったく異なります。
Bashにsomepath/*
一致するファイルがない場合、bashはコマンドにワイルドカードパターンを保持するため、パラメータとがrm
表示されます。ディレクトリに呼び出されたファイルを削除しようとしましたが、そのファイルがないため、この試行は失敗します。オプションをに渡すと、ファイルの欠落について文句を言うことはありません。-rf
somepath/*
rm
*
somepath
-f
rm
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に拡張されます。最後のもの確かに。