我正在阅读此博客帖子https://www.nomachetejuggling.com/2011/09/12/moving-one-git-repo-into-another-as-subdirectory/,作者使用命令mv !(old-project) old-project
。
它是做什么的?
我的猜测是,它将old-project
子文件夹本身之外的所有内容old-project
复制到old-project
子文件夹中。它是如何做到的?
答案 0 :(得分:0)
Bash根据filename expansion中的规则执行pattern matching。 !(old-project)
匹配除old-project
之外的所有内容。
!(pattern-list)
Matches anything except one of the given patterns.
如果old-project
存在并且是目录,并且在当前工作目录中有其他文件或文件夹或其他文件,则其他名称为old-project
:然后mv !(old-project) old-project
移动当前文件中的所有文件和目录当前工作目录old-project
文件夹中的工作目录。
角落案例:
如果old-project
不存在,mv
将失败,并显示mv: target 'old-project' is not a directory
如果old-project
存在并且不是目录(也不是指向目录的符号链接等),则mv
将失败,并与上述错误相同。
如果当前工作目录中除old-project
之外没有文件,目录等,或者old-project
也丢失,则mv
将失败,{{1 }},因为mv: cannot stat '!(old-project)': No such file or directory
不会扩展。
基本上,!(old-project)
会扩展到!(old-project)
以外的所有内容。在终端中,我经常只是执行old-project
并观察mv * old-project
失败,并显示“无法将相同目录移动到自身”错误。在脚本中使用mv
是替代方法。
请注意,要使!(old-project)
在bash中工作,必须使用内置的!(pattern-list)
启用extglob
shell选项。