zshで複数のディレクトリを表すためにワイルドカード文字で 'rm'を使用するときに空のディレクトリを無視する方法は?

zshで複数のディレクトリを表すためにワイルドカード文字で 'rm'を使用するときに空のディレクトリを無視する方法は?

2つ以上のサブディレクトリ内のすべてのファイルを削除しようとしていますが、zshディレクトリが空の場合、次のディレクトリは無視され、ファイルは保持されます。

例:

$ mkdir dir1
$ mkdir dir2
$ touch dir2/blah

# avoid the zsh safety prompt; this may not be necessary for this
# example, just for ease of use here
$ setopt rm_star_silent
$ rm -r dir1/* dir2/*
zsh: no matches found: dir1/*
$ ls dir2
blah

rmBashでは、すでに空のディレクトリが進行を中断することなくdir2削除さdir2/blahれます。

この関数とは何ですか? のように動作させるzsh方法はありますか?rmbash

ベストアンサー1

bashとは異なり、zshデフォルトではファイル名生成パターンと一致するものがない場合はエラーが報告されます。この動作は、全体的に、またはモードごとに変更できます。

NULL_GLOBグローバルな不一致パターンによるエラーメッセージを防ぐには、次のいずれかのオプションを設定できますCSH_NULL_GLOB

  • setopt nullglob
    

    パターンに一致するものがない場合は、パラメータリストから削除されます。エラーメッセージは印刷されません。あなたの例では

    rm dir1/* dir2/*
    

    ただ拡張されます

    rm dir2/blah
    
  • setopt cshnullglob
    

    また、一致しないパターンを削除し、一致するパターンがない場合はエラーメッセージを出力しません。

単一パターンのエラーメッセージを回避するには、このパターンに対してオプションが有効になっているかのNように動作するglob修飾子を使用できます。NULL_GLOB

rm dir1/*(N) dir2/*(N)

これは次のように拡張される予定です。

rm dir2/blah

おすすめ記事