我误删了我的日常工作目录 - 记一次命令行误操作
某天做日常工作的时候遇到了一个小问题,有一个在远程的开发机(不是任何的部署环境)中的测试不能通过。因为相同的测试在本地是可以通过的,于是我打算将远程的代码目录直接通过 rsync
同步到本地来二次检查测试是不是由于不同内核导致,还是由于测试顺序随机导致的。
我在自己的 group
目录,执行了如下的指令将远程的某个 project
子目录同步到当前的 project
目录下:
1 | rsync --delete -e ssh -v -r remote-development-server:~/group/project/ . |
当同步完了之后,ls
发现所有的文件被同步到当前目录而不是 project
下,而且由于加了 --delete
参数,我的当前分组目录下的子目录全部被删除了。这次命令之后,我从记忆中罗列了一下在本地开发环境的损失:
- 若干的本地配置被删除,包括比较敏感的不会被 check in 到 repostiory 的文件,和若干
.dir-locals.el
配置。 - 两个比较常用的本地脚本项目(由于只是个人使用,没有做远程备份或者是其它位置的备份)。
- (可能存在的)一些微小的本地项目改动,不过由于个人有随手 commit 并同步到远程的习惯,有的话也不会是特别大的改动。
由于本地目前没有做过于小时间范围内的数据自动同步,基本上就只能重新 clone 远程的代码了。这件事发生之后,我就每次执行命令行的时候都有点疑神疑鬼的,感觉需要一个 NFS 才能拯救我。为了防止命令行误操作导致不可预知的数据损失,我还特地看了一下 rsync
命令的几个比较有特点的同步表现:
第一种是,如果源位置的目录是没有以 /
结尾的,那么包括源目录本身会被复制到目标目录,比如
1 | rsync -v -r source . # copy to ./source |
另外一种是,源位置的目录后加了 /
,表示这个目录内部的文件复制到目标目录(不包括源目录自己),比如
1 | rsync -v -r source/ . # copy to ./ |
这种情况下,相当于把 source
目录中的文件复制到目标目录,如果你加了 --delete
参数,那么目标目录下的无关文件和目录都会被删除。
至于为什么我会删除掉了的工作目录,是因为我用了 oh-my-zsh
,虽然我的配置会自动删除目录之后的 /
,但是我一时脑抽,看自动删除就加回去了,就导致了这个悲剧发生。关于平时用 rsync
的注意点,建议少加 --delete
参数,或者用之前先 --dry-run
一下,另外,用第一种做法可以防止类似的事发生,如果你想要将 source/folder
备份到 destination/folder
,建议在 destination
目录执行第一种命令。