bash - 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-project
到old-project
子文件夹中,除了old-project
子文件夹本身。它是怎么做到的呢?
解决方案
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 选项。
推荐阅读
- c# - 根据 Unity 中的世界位置隐藏所有孩子
- java - 即使从最近的应用程序中清除应用程序或在 Red MI 设备上关闭应用程序,也可以继续服务
- google-cloud-platform - 谷歌云是否支持 Tibco EMS?如果没有,如何在谷歌云中运行 EMS 代理?
- java - SQL Query with Entity Manager
- python - SQLAlchemy 最多获得 N 个结果,其中每个类别少于 M
- c# - Regex Finding Name and Surname on the String for ID Card
- java - App crashes when trying to create a list of files from a directory
- wordpress - 通过 cron 调用的 wp_insert_post 重复帖子而不是更新它们
- c# - 网站上的图片突然出现403错误,无法加载
- python - Pandas grouped mode and missing values