前言
每次使用文件拷贝 cp
命令或者同步 rsync
命令时都会有些疑惑,不知道路径末尾的 /
需不需要加,隐约感觉到有些不同,但具体的区别却不太清楚,需要实际操作一次才能知道了,下面就来试一试。
rsync 命令的基础格式为 rsync [OPTION...] SRC... [DEST]
,可用于本地文件的同步,如果想同步远程文件也可以,将 SRC
或者 DEST
改成带有IP的远程地址就可以了,但是最多支持一个远端地址,不能两个目录都写成remote格式,其实这个命令之前也用过好几次了,比如 《linux环境下利用rsync+find实现同步指定时间段文件》,这次来看看结尾的 /
到底有什么影响。
准备测试环境
测试环境很简单,只要准备源目录和目标目录就可以了,为了测试各种情况,我需要创建一个比较丰富的目录结构,需要测试的情况有原目录A结尾有无 /
,目标目录B结尾有无 /
,目标目录B中有无同名A文件夹,A文件夹是否为空,目标目录B中有无同名A文件,目标目录不存在,各种情况组合应该是 2 * 2 * 5 = 20种,这不是全部的情况,但已经覆盖大部分想要测试的问题了,因为使用 rsync 通常是同步目录,暂时不考虑源和目标是文件的情况。
测试目录结构如下:
事先说明,以下的每项测试都是在这个原始的基础上进行的,每项测试完成会将目录还原,用以比较不同命令参数下结果的区别,测试选项统一使用 -a --delete
。
rsync测试
测试过程
分小组进行,便于对比
源目录和目标目录结尾都没斜杠 SRC DEST
这种情况的测试结论为,不论目标目录是否存在(没有就创建),都会将源目录拷贝到目标目录之内形成同名文件夹,如果原来有同名文件或文件夹就覆盖掉,如果不加--delete
就会合并。源目录结尾有斜杠而目标目录结尾没斜杠 SRC/ DEST
为了能更快的看到效果,这次我直接一个命令把5种情况都测试了,结论是如果源目录结尾有斜杠,会将源目录中的内容同步到目标目录之内,覆盖掉目标目录之内原有的内容,如果不加--delete
就会和目标目录合并。源目录结尾没有斜杠而目标目录结尾有斜杠 SRC DEST/
还是采用了一个命令测试5种情况的方式,与第一组测试结果一致,都是在目标目录下增加了源目录文件夹,内容保持一致。源目录结尾和目标目录结尾都有斜杠 SRC/ DEST/
测试结果与第二组一致,不再赘述。测试结论
在 rsync 中,执行结果只与原始目录结尾有无斜杠有关,如果不传递原始目录(也称为源目录)的末尾斜杠(/),它将尝试在目标目录中创建源目录的副本,而不是将源目录的内容复制到目标目录中。换句话说,如果没有末尾斜杠,rsync 会尝试在目标目录下创建一个与源目录同名的目录,并将源目录的内容复制到这个同名目录中。
可以简单记忆为,如果原始目录没加末尾斜杠,表示将整个目录拷贝到目标文件夹,如果原始目录加了末尾斜杠,表示将原始目录中的内容拷贝到目标文件夹。
cp和mv两个命令测试
看了上面的测试如果你觉得明白了,那么下面的内容可能会让你再次感到混乱,其实每次使用 cp 命令时还不怎么担心,但是使用mv命令时总是害怕把什么东西覆盖了,还是利用上面的目录结构来测试,只是就不贴具体的测试过程了,我把结论写一下。
cp 和 mv 仅考虑参数均为目录的情况,两个命令中无论是原始目录还是目标目录,结尾是否加斜杠 /
没有影响,都表示目录本身。
- cp 的目标目录不存在,则创建一个与原始目录内容一致的目标文件夹
- cp 的目标目录若存在,则会将原始目录拷贝到目标文件夹下,若在目标文件夹下存在同名目录则合并,若在目标文件夹下存在同名文件,则执行失败,报错
cp: cannot overwrite non-directory 'xxx/vvv' with directory 'vvv'
- mv 的目标目录不存在,则创建一个与原始目录内容一致的目标文件夹,并将原始目录移除
- mv 的目标目录若存在,则将原始目录移动到目标文件夹之下,若在目标文件夹下存在同名空目录则移动成功,若存在同名非空目录则执行失败,报错
mv: cannot move 'vvv' to 'zzz/vvv': Directory not empty
,若在目标文件夹下存在同名文件,也执行失败,报错mv: cannot overwrite non-directory 'xxx/vvv' with directory 'vvv'
所以这样看来mv用于目录时也不会覆盖掉原始的内容,以后可以放心大胆的用了
总结
rsync
命令只有原始目录结尾的斜杠能影响结果,没有斜杠整个原始目录拷贝过去,有斜杠只拷贝原始目录里的内容到目标文件夹cp
和mv
在目标目录不存在是都能执行成功,cp 是复制一份到形成目标目录,mv是将原始目录移动到目标目录cp
的目标目录若存在,其中不能包含和原始目录同名的文件,如果文件夹同名会将内容合并mv
的目标目录若存在,其中不能包含和原始目录同名的文件或非空同名文件夹,如果存在同名空文件夹则会将内容合并mv
命令操作目录时不会随便覆盖,可以放心使用
到底是坚持获得了成功,还是成功之后才能坚持下去,其实要看你怎么定义成功了,不怨我们浮躁,很多先机已经被人家占完了~
2023-7-20 22:32:42