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.

您可以在 zsh 扩展手册页man zshexpn和 zsh 选项手册页 中找到更多信息man zshoptions

在你的:

cp -R dir1/*(DN) dir2/

这意味着隐藏文件也会被复制,但是N限定符在这里没有多大意义,因为这意味着如果没有匹配的文件(如果dir1为空或不可读),则命令将变为:

cp -R dir2/

并且在N抑制的同时不匹配zsh 的错误,你仍然会得到一个(更令人困惑)缺少目标文件操作数错误由cp.

N(nullglob) 在诸如files=( *(N) )for file in *(N)...当可以使用空扩展时最有用。

但就你而言,最好将其排除在外。

或者,如果您不想cp在没有匹配项时运行但不报告错误,您可以这样做:

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

生成的列表(允许为空)被传递给匿名函数,该函数在调用之前检查其大小cp

相关内容