Skip to content

Linux复制文件 ​

1. cp -r(本地复制) ​

  • cp:是 copy 的缩写,用于复制文件或目录。

  • -r(或 -R):是 recursive(递归)的缩写。这个选项告诉 cp 命令,如果源路径是一个目录,就递归地复制该目录及其内部的所有子目录和文件。如果复制目录时不加 -r 选项,命令会报错。

    示例场景:

    bash

    # 1. 将一个目录及其所有内容复制到另一个位置(本地备份)
    cp -r /home/user/documents /media/backup_drive/
    
    # 2. 在当前目录下复制一个项目文件夹,用于新实验
    cp -r old_project/ new_project/
    
    # 操作后,本地文件结构变化:
    # 原位置: /home/user/documents  (仍在)
    # 新位置: /media/backup_drive/documents  (新增)

2. scp(安全远程复制) ​

  • scp:是 secure copy 的缩写。它利用 SSH 协议进行加密传输,因此非常安全。它的语法结合了 cp 和 ssh 的特点。

    语法关键: 指定远程机器的方法是通过 用户名@远程主机IP或域名:路径 的形式。

    示例场景:

    bash

    # 1. 从本地复制到远程服务器 (Upload)
    # 语法: scp -r [本地路径] [用户名]@[服务器地址]:[远程路径]
    scp -r /home/user/my_app/ user@192.168.1.100:/var/www/html/
    # 这会要求你输入 user 在 192.168.1.100 这台服务器上的密码
    
    # 2. 从远程服务器复制到本地 (Download)
    # 语法: scp -r [用户名]@[服务器地址]:[远程路径] [本地路径]
    scp -r user@example.com:/opt/backups/database/ /home/user/local_backups/
    
    # 3. 在两台远程服务器之间复制
    scp -r user1@server1.com:/path/to/data/ user2@server2.com:/path/to/target/

    常用选项:

    • -P <端口号>:如果远程SSH服务不在默认的22端口,需要用此指定端口(注意是大写的P)。

      bash

      scp -P 2222 -r local_dir/ user@example.com:~/remote_dir/
    • -i <身份文件>:使用指定的私钥文件进行连接,而非密码。

      bash

      scp -i ~/.ssh/my_key.pem -r local_dir/ user@example.com:~/remote_dir/

⚠️ 重要注意事项 ​

  1. scp 也需要 -r 来复制目录:和 cp 一样,如果你要复制的是一个目录,必须加上 -r 参数,否则 scp 会报错并拒绝操作。

  2. 路径中的特殊字符:如果文件名或路径中包含空格等特殊字符,务必用引号将其括起来。

    bash

    # 正确
    scp -r "local dir with spaces/" user@example.com:"remote dir with spaces/"
    
    # 错误(会中断)
    scp -r local dir with spaces/ user@example.com:remote dir with spaces/
  3. scp 的替代品:对于需要频繁传输大量文件或增量同步的场景,rsync 命令是比 scp 更优秀的选择,因为它可以智能地只传输变化的文件,节省带宽和时间。其基本用法与 scp 类似。

    bash

    rsync -avz -e ssh /local/path/ user@remote:/path/

💎 总结:如何选择? ​

你的需求应使用的命令
在本机硬盘上备份一个文件夹cp -r
将网站文件上传到VPS服务器scp -r
从生产服务器下载日志文件进行分析scp
在两台远程服务器之间迁移数据scp -r(或更好的 rsync)

一句话总结:

  • 操作本地文件,用 cp -r。
  • 操作远程服务器上的文件,用 scp -r。

希望这个清晰的对比能帮助你更好地理解和使用这两个命令!