linux环境下rsync命令中两个目录结尾的斜杠‘/‘到底有什么作用

前言

每次使用文件拷贝 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 通常是同步目录,暂时不考虑源和目标是文件的情况。

测试目录结构如下:

origin
事先说明,以下的每项测试都是在这个原始的基础上进行的,每项测试完成会将目录还原,用以比较不同命令参数下结果的区别,测试选项统一使用 -a --delete

rsync测试

测试过程

分小组进行,便于对比

  1. 源目录和目标目录结尾都没斜杠 SRC DEST
    1-1
    1-2
    1-3
    1-4
    1-5
    这种情况的测试结论为,不论目标目录是否存在(没有就创建),都会将源目录拷贝到目标目录之内形成同名文件夹,如果原来有同名文件或文件夹就覆盖掉,如果不加 --delete 就会合并。

  2. 源目录结尾有斜杠而目标目录结尾没斜杠 SRC/ DEST
    2-1
    为了能更快的看到效果,这次我直接一个命令把5种情况都测试了,结论是如果源目录结尾有斜杠,会将源目录中的内容同步到目标目录之内,覆盖掉目标目录之内原有的内容,如果不加 --delete 就会和目标目录合并。

  3. 源目录结尾没有斜杠而目标目录结尾有斜杠 SRC DEST/
    3-1
    还是采用了一个命令测试5种情况的方式,与第一组测试结果一致,都是在目标目录下增加了源目录文件夹,内容保持一致。

  4. 源目录结尾和目标目录结尾都有斜杠 SRC/ DEST/
    4-1
    测试结果与第二组一致,不再赘述。

    测试结论

在 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 命令只有原始目录结尾的斜杠能影响结果,没有斜杠整个原始目录拷贝过去,有斜杠只拷贝原始目录里的内容到目标文件夹
  • cpmv 在目标目录不存在是都能执行成功,cp 是复制一份到形成目标目录,mv是将原始目录移动到目标目录
  • cp 的目标目录若存在,其中不能包含和原始目录同名的文件,如果文件夹同名会将内容合并
  • mv 的目标目录若存在,其中不能包含和原始目录同名的文件或非空同名文件夹,如果存在同名空文件夹则会将内容合并
  • mv 命令操作目录时不会随便覆盖,可以放心使用
==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==

到底是坚持获得了成功,还是成功之后才能坚持下去,其实要看你怎么定义成功了,不怨我们浮躁,很多先机已经被人家占完了~

2023-7-20 22:32:42

Albert Shi wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客