zsh:(DN)とはどういう意味ですか?

zsh:(DN)とはどういう意味ですか?

私は、ディレクトリの内容(そのディレクトリの隠しファイルとフォルダを含む)を別のディレクトリにコピーまたは移動するために「不思議な」方法を使用している人がいることを見ました(DN)

cp -R dir1/*(DN) dir2/
mv dir/*(DN) dir2/

man cp再び言及されていないようですman mv。それは何ですか?これについての詳細はどこで確認できますか?

答え1

彼らはzshですグローバル予選

   N      sets the NULL_GLOB option for the current pattern

   D      sets the GLOB_DOTS option for the current pattern

何を意味するのか

  NULL_GLOB (-G)
          If  a pattern for filename generation has no matches, delete the
          pattern from the argument list instead of  reporting  an  error.
          Overrides NOMATCH.
   GLOB_DOTS (-4)
          Do not require a leading `.' in a filename to be matched explic‐
          itly.

man zshexpnzsh拡張マニュアルページとzshオプションマニュアルページで詳細情報を見つけることができますman zshoptions

あなたの場所:

cp -R dir1/*(DN) dir2/

つまり、隠しファイルもコピーされますが、N修飾子はここでは意味がありません。一致するファイルがない場合(dir1空であるか読み取れない場合)、コマンドは次のようになるためです。

cp -R dir2/

そしてN鎮圧しながら矛盾zshエラーが発生すると、まだ(より混乱している)エラーが発生します。ターゲットファイルオペランドがありません。エラーの原因はですcp

N(nullglob)は、null拡張が可能な場合files=( *(N) )と同じ状況で最も便利です。for file in *(N)...

でも心配になれば、ただ置いておくことをお勧めします。

cpまたは、一致するものがない場合にエラーを報告せずに実行したくない場合は、次のようにします。

function { (( $# == 0 )) || cp -R -- "$@" dir2/; } dir1/*(ND)

結果のリスト(空の許可)は、呼び出し前にサイズを確認する匿名関数に渡されますcp

関連情報