中かっこ拡張を使用したzshのファイルの一致

中かっこ拡張を使用したzshのファイルの一致

bash中かっこを使用して、複数のファイルのパターンを一致させることができます。

ls *.{dot,svg,err}

特定の拡張子を持つファイルがない場合は警告が表示されますが、残りのファイルは一覧表示されます。

ls: '*.err' にアクセスできません: そのファイルまたはディレクトリがありません

しかし、zsh代わりにエラーが発生します。出力なし既存のファイルに対して生成されます。

zsh: 一致するものが見つかりません: *.err

削除時にも機能します。以下を使用してファイルを削除してみてください。

rm -f *.{dot,svg,err}

bash一致するすべてのファイルはエラーや警告なしに削除されますが、zshエラーが発生して何も削除されません。

zsh動作をthisと同じにする方法はありますかbash、または既存のファイルを簡単に削除/並べ替える他の方法はありますか?


明らかに同様のことができますが、find . -name '*.dot' -or -name '*.svg' -or -name '.err' | xargs rm特に簡単で実用的ではありません。

答え1

あなたは得られない警告bash、あなたは間違いby lsls終了ステータスが0ではないため失敗したことを示します)

zshbashとはワイルドカードで{...}はなく、ワイルドカードの前に発生する拡張です。

存在する:

ls -d -- *.{dot,svg,err}

(忘れまし-dたが--)シェルは最初の{...}ものを拡張します。

ls -d -- *.dot *.svg *.err

その後、globを実行します。bashほとんどのBourne型シェルと同様に、一致しないグローブが変更されずに渡されるという欠陥があります。 on の場合、zsh一致しないグローブはエラーです。

norという名前のファイルがない場合は、ファイルを削除するrm -f [ab].c方法を確認してください。bashから[ab].ca.cb.czsh矛盾代わりにエラーが発生しました。同様の動作については、のfailglobオプションを参照してください。bash

ls -d -- *.{dot,svg,err}(N)

inはzsh3つのすべてのglobに対してオプションを有効にするので、nullglobglobが一致しない場合は削除されますが、globのいずれかのファイルが一致しない場合、コマンドは次のようになります。

ls -d --

.(現在のディレクトリ)が一覧表示されます。

ここで使用するのが最善です一つglobは3つの拡張子のうちの1つを持つファイルと一致します。

ls -d -- *.(dot|svg|err)

パターンに一致するファイルが見つからない限り、実行されるソート済みlsファイルのリストが提供されます。ls

オプションで、またはsh/ bash(偽のIMO)動作を有効にするためにも使用できます.やや良いアプローチは、この動作を有効にすることです(これは、Bourneシェルがリリースされる前のUnixシェルの動作でもありました)。emulate shunsetopt nomatchcsh

setopt cshnullglob

このオプションを使用すると、次の場合にのみコマンドがキャンセルされます。みんなコマンドラインのglobは一致しません。一致する項目が 1 つ以上ある場合、一致しない項目はすべて削除されるため、次のようになります。

ls -d -- *.{dot,svg,err}

拡張されていdotない項目svgerr順番に省略されます。

引数の順序に対するさまざまなメソッドの効果を比較するには、そのlsメソッドを表示する前にソートしない(逆に)コマンドが必要です。 GNUを使用すると、lsそのオプションを渡すことができます-U。またはls引数はここにのみ印刷されるためprintf '%s\n' *...

答え2

パターンが修正されました(N)。これは、一致が欠落しているためにzshに怒らせるように指示します。

rm -f *.{dot,svg,err}(N)

これはzshグローバル機能です。man zshexpn詳しくは、「グローバル修飾子」を参照してください。 「現在のモードにNULL_GLOBオプションを設定してください」と説明しています。

関連情報