我看到,为了将目录内容(包括该目录中的隐藏文件和文件夹)复制或移动到另一个目录,有些人使用“神秘”的(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
。