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 ls
(ls
終了ステータスが0ではないため失敗したことを示します)
zsh
bash
とはワイルドカードで{...}
はなく、ワイルドカードの前に発生する拡張です。
存在する:
ls -d -- *.{dot,svg,err}
(忘れまし-d
たが--
)シェルは最初の{...}
ものを拡張します。
ls -d -- *.dot *.svg *.err
その後、globを実行します。bash
ほとんどのBourne型シェルと同様に、一致しないグローブが変更されずに渡されるという欠陥があります。 on の場合、zsh
一致しないグローブはエラーです。
norという名前のファイルがない場合は、ファイルを削除するrm -f [ab].c
方法を確認してください。bash
から[ab].c
a.c
b.c
zsh
矛盾代わりにエラーが発生しました。同様の動作については、のfailglob
オプションを参照してください。bash
ls -d -- *.{dot,svg,err}(N)
inはzsh
3つのすべてのglobに対してオプションを有効にするので、nullglob
globが一致しない場合は削除されますが、globのいずれかのファイルが一致しない場合、コマンドは次のようになります。
ls -d --
.
(現在のディレクトリ)が一覧表示されます。
ここで使用するのが最善です一つglobは3つの拡張子のうちの1つを持つファイルと一致します。
ls -d -- *.(dot|svg|err)
パターンに一致するファイルが見つからない限り、実行されるソート済みls
ファイルのリストが提供されます。ls
オプションで、またはsh
/ bash
(偽のIMO)動作を有効にするためにも使用できます.やや良いアプローチは、この動作を有効にすることです(これは、Bourneシェルがリリースされる前のUnixシェルの動作でもありました)。emulate sh
unsetopt nomatch
csh
setopt cshnullglob
このオプションを使用すると、次の場合にのみコマンドがキャンセルされます。みんなコマンドラインのglobは一致しません。一致する項目が 1 つ以上ある場合、一致しない項目はすべて削除されるため、次のようになります。
ls -d -- *.{dot,svg,err}
拡張されていdot
ない項目svg
はerr
順番に省略されます。
引数の順序に対するさまざまなメソッドの効果を比較するには、そのls
メソッドを表示する前にソートしない(逆に)コマンドが必要です。 GNUを使用すると、ls
そのオプションを渡すことができます-U
。またはls
引数はここにのみ印刷されるためprintf '%s\n' *...
。
答え2
パターンが修正されました(N)
。これは、一致が欠落しているためにzshに怒らせるように指示します。
rm -f *.{dot,svg,err}(N)
これはzsh
グローバル機能です。man zshexpn
詳しくは、「グローバル修飾子」を参照してください。 「現在のモードにNULL_GLOBオプションを設定してください」と説明しています。