最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Shell命令实现文件目录服务器间快速转移
时间:2026-08-05 13:49:50 编辑:袖梨 来源:一聚教程网
Shell命令实现文件目录服务器间快速转移并不只看表面做法,关键还要理解相关条件、限制和后续影响。
一,脚本样例
该脚本代码主要实现将本地的 gitbook 文件或目录打包压缩后,通过 SSH 远程传输到指定服务器的 /work 目录下。

1, 初始版本
#安装工具yum install -y pigz pv#压缩gitbook目录传输cd /giteetar -czf - gitbook|ssh [email protected] 'tar -xzf - -C /work'#压缩文件传输tar -czf - nginx:1.31-alpine-slim.tar.gz|ssh [email protected] 'tar -xzf - -C /work'
2, 优化版本(pigz|pv)
#压缩gitbook目录传输cd /giteetar -cf - gitbook|pigz|pv|ssh [email protected] 'tar -xzf - -C /work'#压缩文件传输tar -cf - nginx:1.31-alpine-slim.tar.gz|pigz|pv|ssh [email protected] 'tar -xzf - -C /work'
pigz命令是Linux系统中用于文件压缩的工具,属于gzip的并行实现,旨在利用多核处理器的优势来加速压缩过程, 它支持gzip的所有选项和压缩级别,兼容性良好。
pv 命令可以用于计算数据传输的速度,显示进度条以及估算剩余时间等。
运行结果
[root@00fly gitee]# lsdocker-demo docker-run dos2unix.sh effict-side gitbook git-update.sh microservice-all-in-one springcloud-swarm[root@00fly gitee]# tar -czf - gitbook|ssh [email protected] 'tar -xzf - -C /work'[email protected]'s password:
下面对代码进行详细拆分解释
二,代码拆分及含义
1, 本地操作部分:tar -czf - gitbook
- tar:是 Linux 系统中用于文件打包和压缩的命令。
- -c:创建一个新的归档文件,即打包文件。
- -z:表示使用 gzip 算法进行压缩,将打包后的文件进一步压缩。
- -f:指定归档文件的名称,这里 - 表示将打包压缩后的文件输出到标准输出(stdout),而不是保存为本地的文件。
- -:不写出本地文件,直接把数据写到到标准输出(stdout)。
- gitbook:是需要打包压缩的本地文件或目录。
2,管道部分:|
- 管道符号 | 的作用是将前一个命令(tar -czf - gitbook)的标准输出作为后一个命令(ssh)的标准输入。
3,远程操作部分:ssh [email protected] 'tar -xzf - -C /work'
- ssh:用于通过网络安全地连接到远程服务器的命令。
- [email protected]:root 是远程服务器的用户名,118.178.93.190 是远程服务器的 IP 地址,这部分表示以 root 用户身份连接到 IP 为 118.178.93.190 的远程服务器。
- 'tar -xzf - -C /work':这是在远程服务器上执行的命令。
- -x:表示从归档文件中提取文件,即解包。
- -z:表示使用 gzip 算法进行解压缩。
- -f:指定要操作的归档文件,这里 - 表示从标准输入(stdin)读取数据,也就是接收通过 SSH 管道传输过来的数据。
- -:表示接受标准输入(stdin)的数据。
- -C /work:将解包解压缩后的文件放置到 /work 目录下。
三,辅助脚本
files-p2p.sh
#!/bin/bash# 定义默认服务器地址DEFAULT_IP="120.55.67.54"# 显示欢迎信息echo "======================================"echo " 文件上传配置工具"echo "======================================"echo ""# 步骤1:显示本地文件列表并让用户选择echo "【步骤1】请选择本地文件(输入序号):"echo "--------------------------------------"files=() # 存储文件序号和名称for i in $(seq 1 10); do # 示例:展示前10个文件(可根据需求调整数量) file=$(ls 2>/dev/null | sed -n "${i}p") if [ -n "$file" ]; then files+=("$i: $file") echo "$i. $file" fidoneecho "--------------------------------------"while true; do read -p "输入文件序号(1-${#files[@]}):" choice if [[ $choice =~ ^[0-9]+$ ]] && [ $choice -ge 1 ] && [ $choice -le ${#files[@]} ]; then selected_file="${files[$((choice-1))]}" selected_filename=$(echo "$selected_file" | cut -d' ' -f2-) break else echo "无效的序号,请重新输入!" fidoneecho "已选择文件:$selected_filename"echo ""# 步骤2:带超时的服务器IP输入echo "【步骤2】请输入远程服务器IP地址,否则使用默认值 $DEFAULT_IP):"read -p "IP地址:" server_ipif [ -z "$server_ip" ]; then server_ip=$DEFAULT_IP echo "未输入远程服务器IP地址,使用默认IP:$server_ip"else # 简单IP格式校验(可选) if ! [[ $server_ip =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]]; then echo "IP格式错误,强制使用默认值:$DEFAULT_IP" server_ip=$DEFAULT_IP fifiecho ""# 步骤3:输入远程服务器文件保存目录echo "【步骤3】请输入远程服务器文件保存目录:"read -p "保存目录(例如:/work):" remote_dirif [ -z "$remote_dir" ]; then remote_dir="/work" # 设置默认目录(可根据需求调整) echo "未输入目录,使用默认目录:$remote_dir"fiecho ""# 最终输出拼接结果echo "======================================"echo " 配置结果汇总"echo "======================================"echo "【本地文件或目录】:$selected_filename"echo "【远程服务器IP 】:$server_ip"echo "【远程服务器目录】:$remote_dir"echo "【 生成执行命令 】:tar -cf - ${selected_filename}|pigz|pv|ssh root@$server_ip 'tar -xzf - -C $remote_dir'"echo "======================================"echo "开始执行文件转移命令!"eval "tar -cf - ${selected_filename}|pigz|pv|ssh root@$server_ip 'tar -xzf - -C $remote_dir'"运行结果
[root@00fly work]# sh files-p2p.sh ====================================== 文件上传配置工具======================================【步骤1】请选择本地文件(输入序号):--------------------------------------1. docker-run2. effict-side3. files-p2p.sh4. p2p.sh5. top-shell--------------------------------------输入文件序号(1-5):2已选择文件:effict-side【步骤2】请输入远程服务器IP地址(10秒内输入,否则使用默认值 192.168.0.1):IP地址:未在规定时间内输入,使用默认IP:192.168.0.1【步骤3】请输入远程服务器文件保存目录:保存目录(例如:/data/upload):/work====================================== 配置结果汇总======================================本地文件:effict-side远程服务器IP:192.168.0.1远程服务器目录:/work文件转移命令:tar -cf - effict-side|pigz|pv|ssh [email protected] 'tar -xzf - -C /work'
四,总结
该脚本的整体功能是将本地的 文件或目录进行打包压缩,然后通过 SSH 连接将压缩数据传输到远程服务器,并在远程服务器上进行解包解压缩操作,将文件放置到远程目录下。
与scp命令比较
有同学可能会问scp命令不是也具备这样的功能吗
#从本机递归复制整个目录到远程scp -r /work/docker [email protected]:/work
作为对比,大家可以修改脚本69、72行,选择大文件目录跨服务器迁移,自行运行脚本对比。