首页 > 解决方案 > mv !(old-project) old-project 做什么?

问题描述

我正在阅读这篇博文https://www.nomachetejuggling.com/2011/09/12/moving-one-git-repo-into-another-as-subdirectory/,作者在其中使用了命令mv !(old-project) old-project

它有什么作用 ?

我的猜测是它将所有内容复制old-projectold-project子文件夹中,除了old-project子文件夹本身。它是怎么做到的呢?

标签: bashshell

解决方案


Bash根据模式匹配中的规则执行文件名扩展。匹配除.!(old-project)old-project

!(pattern-list)

    Matches anything except one of the given patterns. 

如果old-project存在并且是一个目录并且当前工作目录中有文件或文件夹或其他名为other then 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将失败mv: cannot stat '!(old-project)': No such file or directory,因为!(old-project)不会扩展。

基本上,!(old-project)扩展到除old-project. 在终端中,我经常只是mv * old-project看着mv失败并出现“无法将相同的目录移动到自身”错误。在脚本中使用!(old-project)是另一种选择。

请注意,!(pattern-list)要在 bash 中工作,extglob必须使用shopt内置函数启用 shell 选项。


推荐阅读