欢迎光临
我们一直在努力

一条Shell命令实现文件目录服务器间快速转移

文章目录

  • 一,脚本样例
    • 1, 初始版本
    • 2, 优化版本(pigz|pv)
  • 二,代码拆分及含义
    • 1, 本地操作部分:**`tar -czf – gitbook`**
    • 2,管道部分:**`|`**
    • 3,远程操作部分:**`ssh root@118.178.93.190 'tar -xzf – -C /work'`**
  • 三,辅助脚本
  • 四,总结

一,脚本样例

该脚本代码主要实现将本地的 gitbook 文件或目录打包压缩后,通过 SSH 远程传输到指定服务器的 /work 目录下。

1, 初始版本

#安装工具
yum install -y pigz pv

#压缩gitbook目录传输
cd /gitee
tar -czf – gitbook|ssh root@118.178.93.190 'tar -xzf – -C /work'

#压缩文件传输
tar -czf – nginx\\:1.31-alpine-slim.tar.gz|ssh root@118.178.93.190 'tar -xzf – -C /work'

2, 优化版本(pigz|pv)

#压缩gitbook目录传输
cd /gitee
tar -cf – gitbook|pigz|pv|ssh root@118.178.93.190 'tar -xzf – -C /work'

#压缩文件传输
tar -cf – nginx\\:1.31-alpine-slim.tar.gz|pigz|pv|ssh root@118.178.93.190 'tar -xzf – -C /work'

pigz命令是Linux系统中用于文件压缩的工具,属于gzip的并行实现,旨在利用多核处理器的优势来加速压缩过程, 它支持gzip的所有选项和压缩级别,兼容性良好。

pv 命令可以用于计算数据传输的速度,显示进度条以及估算剩余时间等。

运行结果

[root@00fly gitee]# ls
docker-demo docker-run dos2unix.sh effict-side gitbook git-update.sh microservice-all-in-one springcloud-swarm
[root@00fly gitee]# tar -czf – gitbook|ssh root@118.178.93.190 'tar -xzf – -C /work'
root@118.178.93.190's password:

下面对代码进行详细拆分解释

二,代码拆分及含义

1, 本地操作部分:tar -czf – gitbook

  • tar:是 Linux 系统中用于文件打包和压缩的命令。

  • -c:创建一个新的归档文件,即打包文件。

  • -z:表示使用 gzip 算法进行压缩,将打包后的文件进一步压缩。

  • -f:指定归档文件的名称,这里 – 表示将打包压缩后的文件输出到标准输出(stdout),而不是保存为本地的文件。

  • -:不写出本地文件,直接把数据写到到标准输出(stdout)。

  • gitbook:是需要打包压缩的本地文件或目录。

2,管道部分:|

  • 管道符号 | 的作用是将前一个命令(tar -czf – gitbook)的标准输出作为后一个命令(ssh)的标准输入。

3,远程操作部分:ssh root@118.178.93.190 'tar -xzf – -C /work'

  • ssh:用于通过网络安全地连接到远程服务器的命令。

  • root@118.178.93.190: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="192.168.0.1"
    TIMEOUT_SECONDS=10

    # 显示欢迎信息
    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"
    fi
    done
    echo "————————————–"

    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 "无效的序号,请重新输入!"
    fi
    done
    echo "已选择文件:$selected_filename"
    echo ""

    # 步骤2:带超时的服务器IP输入
    echo "【步骤2】请输入远程服务器IP地址(${TIMEOUT_SECONDS}秒内输入,否则使用默认值 $DEFAULT_IP):"
    read -t $TIMEOUT_SECONDS -p "IP地址:" server_ip
    if [ -z "$server_ip" ]; then
    server_ip=$DEFAULT_IP
    echo "未在规定时间内输入,使用默认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
    fi
    fi
    echo ""

    # 步骤3:输入远程服务器文件保存目录
    echo "【步骤3】请输入远程服务器文件保存目录:"
    read -p "保存目录(例如:/data/upload):" remote_dir
    if [ -z "$remote_dir" ]; then
    remote_dir="/default/upload" # 设置默认目录(可根据需求调整)
    echo "未输入目录,使用默认目录:$remote_dir"
    fi
    echo ""

    # 最终输出拼接结果
    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'"

    运行结果

    [root@00fly work]# sh files-p2p.sh
    ======================================
    文件上传配置工具
    ======================================

    【步骤1】请选择本地文件(输入序号):
    ————————————–
    1. docker-run
    2. effict-side
    3. files-p2p.sh
    4. p2p.sh
    5. 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 root@192.168.0.1 'tar -xzf – -C /work'

    四,总结

    该脚本的整体功能是将本地的 文件或目录进行打包压缩,然后通过 SSH 连接将压缩数据传输到远程服务器,并在远程服务器上进行解包解压缩操作,将文件放置到远程目录下。

    朋友们,你学会了吗?

    –over–

    赞(0)
    未经允许不得转载:171主机测评 » 一条Shell命令实现文件目录服务器间快速转移
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址