利用scp不改变属性远程备份文件夹

本文介绍了一种使用find、xargs和scp命令手动编写脚本来备份图片服务器文件的方法,包括如何按时间筛选文件并实现定时任务自动备份。

前段时间,由于硬件故障,图片服务器宕机啦。文件服务程序倒是很简单,可以找到代码,很快就可以部署。但是几十个G的图片还在那台机器上,怎么办?之前从来没有文件备份过,死了,要挨骂了。好在硬件故障解决了,图片服务器也恢复了,业务正常了。主管说,你还是备份吧。之前也想过,但是给的机器就三台:一台CMS,一台接口,一台文件服务器(数据库都是dba统一管控的,不用我们管),没有多余的机器用来备份文件呀。去找主机运维要机器,死活不给,说你们交叉备份吧。好吧,只能这样了。

网上搜了下,现成工具多得是,不想用啊,麻烦。自己写脚本吧。

图片目录结构如下图:
在这里插入图片描述
结构很简单,一天一个目录,上传的图片就在每一天的目录里头。

主要思路:通过find命令找到指定时间段内的文件夹,然后以此作为参数xargs,递归把文件夹及文件下面的文件scp到另外一台机器。

先同步现有的文件,文件太多,大概有四五万,担心一次性同步参数个数超过xargs的限制,还是按时间一部分一部分同步吧。用的命令主要是find、xargs、scp,都是系统自带的。脚本如下:

find . -mtime +720 -mtime -727 -type d |xargs -I{
   
   } 
<think>我们正在讨论的是使用scp命令从远程服务器复制文件夹到本地。根据引用[1]和引用[2],我们可以得到两种常用的命令格式。 引用[1]提到:将本地文件夹拷贝到远程服务器的命令,但我们需要的是反向操作(从远程复制到本地)。引用[2]则明确给出了从远程复制整个文件夹下的文件到本地的命令。 从引用[2]中提取的命令格式如下: ```bash scp -P [远程端口号] -r [远程用户名]@[远程服务器IP]:[远程备份文件夹] [本地文件夹路径] ``` 注意: - `-P` 指定端口号(注意是大写P),如果远程服务器使用默认端口22,则可以省略。 - `-r` 表示递归复制整个文件夹。 - 远程路径的格式为:`[用户名]@[服务器IP或主机名]:[远程文件夹路径]` - 本地文件夹路径:指定本地存放的目录。 另外,引用[3]也指出,scp命令需要从本地工作站运行,它通过建立自己的连接来传输文件。 因此,从远程服务器复制文件夹到本地的通用命令为: ### 1. **基本命令格式(使用默认端口22)** ```bash scp -r [远程用户名]@[远程服务器IP]:[远程文件夹路径] [本地存放路径] ``` 示例:将远程服务器上`/home/user/data`文件夹复制到本地的`/local/path`目录 ```bash scp -r user@192.168.1.100:/home/user/data /local/path ``` ### 2. **指定端口号(如果远程服务器SSH端口是默认的22)** ```bash scp -P [端口号] -r [远程用户名]@[远程服务器IP]:[远程文件夹路径] [本地存放路径] ``` 示例:远程服务器SSH端口为31551,将远程文件夹`/Server/ResultData`复制到本地的`D:/Local/Resultdata/`(注意:在Linux本地路径使用正斜杠,Windows路径可能需要调整) ```bash scp -P 31551 -r root@10.218.13.165:/Server/ResultData /mnt/d/Local/Resultdata ``` 注意:如果本地是Windows系统,在命令提示符(cmd)或PowerShell中使用,路径可以使用反斜杠,但通常使用正斜杠也可以。如果路径包含空格,需要用引号括起来。 ### 3. **注意事项** - **权限问题**:确保你有权限访问远程文件夹和本地目标路径。 - **路径格式**:远程路径中如果包含空格或特殊字符,需要用引号括起来(例如:`"/path/with space"`)。 - **目标路径**:本地存放路径如果存在,scp会自动创建,需要先确保目录存在。 - **连接问题**:如果使用密钥认证,可能需要通过`-i`选项指定私钥文件(例如:`scp -i ~/.ssh/id_rsa ...`)。 ### 4. **使用密钥认证(无密码)** 如果设置了SSH密钥认证,可以省略密码输入: ```bash scp -i [私钥文件路径] -r [用户名]@[服务器IP]:[远程路径] [本地路径] ``` 示例: ```bash scp -i ~/.ssh/mykey.pem -r user@192.168.1.100:/remote/dir /local/dir ``` ### 5. **复制单个文件(需要`-r`)** 如果只需要复制文件(而文件夹),可以去掉`-r`选项: ```bash scp user@192.168.1.100:/remote/file.txt /local/path/ ``` ### 总结 从远程服务器复制整个文件夹到本地的核心命令是: ```bash scp -r [用户名]@[服务器IP]:[远程文件夹] [本地路径] ``` 如果端口是默认的22,则添加`-P [端口号]`(注意是大写P)。 根据引用[2]的示例,我们还可以使用通配符复制文件夹内的所有文件(但包括文件夹本身),但通常我们使用`-r`递归复制整个文件夹及其子目录。 请根据实际情况替换命令中的参数。 §§相关问题§§ 1. 使用scp复制文件夹时如何显示进度? 2. 如何通过scp在复制过程中限制带宽? 3. 除了scp,还有哪些安全的文件传输工具(如rsync)?</think>### 使用 SCP远程服务器复制文件夹到本地的命令 根据引用内容,使用 SCP远程服务器复制文件夹到本地的核心命令格式如下: ```bash scp -P [端口号] -r [远程用户名]@[远程服务器IP]:[远程文件夹路径] [本地保存路径] ``` #### 详细参数说明: 1. **`-P`**:指定远程服务器SSH 端口号(**大写 P**) - 默认 SSH 端口为 22 时可省略 - 示例:`-P 31551`(引用[2]) 2. **`-r`**:递归复制整个文件夹(必需参数) - 表示复制目录及其所有子内容 3. **远程路径格式**: `用户名@服务器IP:文件夹路径` - 示例:`root@10.218.13.165:/Server/ResultData/`(引用[2]) 4. **本地路径**: 本地保存目录的绝对路径或相对路径 --- ### 具体操作示例 #### 示例 1:使用默认端口 (22) ```bash scp -r user@203.0.113.10:/remote/data /local/path/ ``` - 将远程服务器 `203.0.113.10` 上 `/remote/data` 文件夹复制到本地的 `/local/path` 目录 - 默认使用 22 端口,无需 `-P` 参数 #### 示例 2:指定自定义端口(引用[2]) ```bash scp -P 31551 -r root@10.218.13.165:/Server/ResultData/ ~/Desktop/Backup/ ``` - 端口 `31551` - 远程路径:`/Server/ResultData/` - 保存到本地桌面 `Backup` 文件夹 #### 示例 3:复制文件夹内容(非文件夹本身) ```bash scp -P 2222 -r admin@example.com:/var/logs/* ./logs_backup/ ``` - 复制远程 `/var/logs/` 目录下所有文件到本地 `logs_backup` 文件夹 - 使用通配符 `*` 复制内容但包含父文件夹 --- ### ⚠️ 注意事项 1. **路径格式**: - 远程路径使用绝对路径(以 `/` 开头) - 本地路径若含空格,需加引号:`"/path/with space"` 2. **认证方式**: - 首次连接需确认主机密钥(输入 `yes`) - 使用密钥认证更安全(添加 `-i /path/to/key.pem`) 3. **网络要求**: - 本地需能访问远程服务器SSH 端口 - 大文件传输建议用 `rsync`(支持断点续传) 4. **权限问题**: - 确保远程用户有读取权限 - 本地目录需有写入权限 > 引用[3]强调:SCP 命令需在**本地终端执行**,它会建立独立于 SSH 的新连接传输文件。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值