两台服务器同步修改的文件
为什么用*会报错?
- 未指定递归:
scp默认只拷贝单个文件。如果不加-r参数,遇到文件夹(如res、src、assets)时,它会报错not a regular file并跳过。 - 目标路径被本地 Shell 解析:你在本地终端输入目标路径
/.../FactoryMode/*时,你本地的 Bash 会自动把*展开为本地该目录下的所有子文件名。这会导致scp接收到多个目标参数,从而引发混乱和类似cp: -r not specified的错误。
根据你的具体需求,有以下几种更好的解决方法:
方法一:使用rsync(最推荐,能自动同步修改过的文件)
既然你有许多修改过的文件(包括 Java、XML、Strings 等),使用rsync是最方便、最安全的方法。它会自动对比两台服务器的文件,只拷贝有修改的文件,并且会自动创建和维护目录结构。
在本地执行以下命令(注意源路径和目标路径结尾的/):
rsync -avz src/ dist/
- 优点:不需要考虑哪些是文件夹哪些是文件,它会把两边的
FactoryMode目录完美同步,且速度极快。
方法二:如果只需要那一个特定的aging_test.xml
如果你其实只需要这一个 xml 文件,不需要拷贝整个目录,直接指定该文件的完整路径进行scp即可:
scp aging_test aging_tests.xml
方法三:如果你坚持使用scp拷贝整个目录
如果要用scp拷贝包含子目录的完整文件夹,必须使用-r参数(代表 recursive,递归拷贝),且目标路径写到它的上一级目录(即apps目录),否则容易产生目录嵌套(例如在FactoryMode下又生成一个FactoryMode):
scp -r FactoryMode apps/