如何用带通配符的单条命令将SVN目录内容移至子目录?
单条命令实现SVN目录结构调整方案
当然可以用单条命令完成这个操作!结合SVN命令和shell的通配符/管道能力,完全能复刻你提到的简洁操作风格,下面分两种场景给你具体方案:
方案1:依赖Bash扩展通配符(和你想要的风格最匹配)
这种方式和你举例的mkdir folderB mv !(folderB) folderB逻辑一致,需要Bash开启extglob扩展(大部分现代Bash默认可能未开启,临时开启即可):
- 先临时开启扩展(当前shell会话有效):
shopt -s extglob - 切换到目标目录:
cd trunk/folderA - 执行单条命令:
svn mkdir folderB && svn move !(folderB) folderB - 细节说明:
svn mkdir folderB先在SVN中创建子目录folderB,同时将创建操作纳入版本控制!(folderB)是Bash的扩展通配符,会匹配当前目录下除了folderB之外的所有文件和子目录- 可以先加
--dry-run参数做测试,确认操作范围:svn mkdir folderB && svn move --dry-run !(folderB) folderB
方案2:通用无依赖方案(适配所有Shell环境)
如果你的环境不支持Bash扩展,或者想更通用,可以用管道和进程替换实现:
- 切换到目标目录:
cd trunk/folderA - 执行单条命令:
svn mkdir folderB && svn move --targets <(svn ls | grep -v folderB) folderB - 细节说明:
svn ls列出当前目录下所有受SVN管控的内容grep -v folderB过滤掉刚创建的folderB<(...)是进程替换,把前面的输出作为--targets参数的输入,告诉SVN要移动哪些内容
重要注意事项
- 操作前请先执行
svn update确保本地工作副本是最新状态,避免冲突 - 操作完成后记得提交变更:
svn commit -m "Move all contents of folderA into folderA/folderB" - 如果folderA包含隐藏文件(以
.开头),方案1需要额外开启dotglob扩展:shopt -s dotglob,否则通配符不会匹配隐藏文件
内容的提问来源于stack exchange,提问作者SloppyNick
相关产品推荐
相关产品推荐

