Linux环境下移动一个文件夹下的所有文件到另一个文件夹
研究命令
最近需要把一个环境里的文件,迁移到另一个环境里去,但是两个环境里的数据会有一些同名的子目录,要求不能覆盖数据而是合并,迁移之前我先做了文件备份,然后网上查了下命令。
#移动a文件夹下的所有文件到b文件夹
mv /a/* /b
但是如果有重名的子文件夹或者文件的话,这个命令会一直提示是否需要overwrite
然后我查到
#强制移动a文件夹下的所有文件到b文件夹,如果有重复会备份文件
mv -fb /a/* /b
查询问题
命令很快执行完,我以为任务完成了,后面测试反馈有些文件找不到,我就去找问题,发现有些目录被覆盖掉了。
如下图所示,上面的命令如果有相同的目录,会生成同名文件夹然后加一个~
后面我发现执行这个命令,如果有同名子目录,a文件夹里的子目录会把之前b文件夹里的同名子目录覆盖掉。
比如:
a文件夹下子目录结构如下
b文件夹下子目录结构如下
执行上面的命令,wangdongqin/2021就变成a文件夹下的结构只有2一个子目录了,把之前b文件夹下的子目录全覆盖了。
这样肯定不符合我的需求,还好我在mv参数上加了-b,生成了备份文件。
解决问题
然后我咨询运维人员,得到了新的命令
#强制移动a文件夹下的所有文件到b文件夹,如果有重复会备份文件
rsync -azvr wangdongqin~/ wangdongqin/
-a选项,它保留了所有人和所属组、时间戳、软链接、权限,并以递归模式运行。
-z来启用压缩。
-v是可视化。
-r是递归。
再用diff命令来对比两个文件夹是否有差别
diff -r wangdongqin~/ wangdongqin/
发现没有问题了,两个目录的文件完全合并了,而不是覆盖。
然后删除重复的 ~文件夹
find ./ -type d -name '*~'| xargs rm -rf
总结
做任何操作之前一定要备份数据,然后不熟悉的命令最好先测试下效果,然后遇到问题,自己解决不了,可以去求助一下专业人士。