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

 更新时间:2026年08月04日 09:46:27   作者:爱码少年 00fly.online  
本文主要介绍了Shell命令实现文件目录服务器间快速转移,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一,脚本样例

该脚本代码主要实现将本地的 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="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"
    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地址,否则使用默认值 $DEFAULT_IP):"
read -p "IP地址:" server_ip
if [ -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
    fi
fi
echo ""

# 步骤3:输入远程服务器文件保存目录
echo "【步骤3】请输入远程服务器文件保存目录:"
read -p "保存目录(例如:/work):" remote_dir
if [ -z "$remote_dir" ]; then
    remote_dir="/work"  # 设置默认目录(可根据需求调整)
    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'"
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-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 连接将压缩数据传输到远程服务器,并在远程服务器上进行解包解压缩操作,将文件放置到远程目录下。

与scp命令比较

有同学可能会问scp命令不是也具备这样的功能吗

#从本机递归复制整个目录到远程
scp -r /work/docker root@116.196.92.147:/work

作为对比,大家可以修改脚本69、72行,选择大文件目录跨服务器迁移,自行运行脚本对比。

到此这篇关于Shell命令实现文件目录服务器间快速转移的文章就介绍到这了,更多相关Shell 文件目录服务器间转移内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • shell脚本中main函数中$#获取不到脚本传入参数个数浅析

    shell脚本中main函数中$#获取不到脚本传入参数个数浅析

    Linux的shell脚本,有时候我们在运行shell脚本时会给脚本传入参数,出于逻辑上的严谨,在脚本中可能会做一些逻辑判断或处理,例如判断脚本传入参数的个数,这篇文章主要介绍了shell脚本中main函数中$#获取不到脚本传入参数个数浅析,需要的朋友可以参考下
    2024-03-03
  • ./ 和 sh 的使用区别详解

    ./ 和 sh 的使用区别详解

    这篇文章主要介绍了./ 和 sh 的使用区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • linux 监视端口是否正常的shell脚本

    linux 监视端口是否正常的shell脚本

    linux 监视端口是否正常的shell脚本,需要的朋友可以参考下
    2013-01-01
  • 实现MySQL定时批量检查表repair和优化表optimize table的shell脚本

    实现MySQL定时批量检查表repair和优化表optimize table的shell脚本

    这篇文章主要介绍了实现MySQL定时批量检查表repair和优化表optimize table的shell脚本,非常实用,需要的朋友可以参考下
    2014-07-07
  • nginx日志切割脚本分享

    nginx日志切割脚本分享

    nginx日志太大怎么办,只有分割一下了,这篇文章就介绍了一下nginx日志切割脚本,需要的朋友可以参考下
    2014-03-03
  • Django中shell命令的使用

    Django中shell命令的使用

    Django的manage工具提供了shell命令,本文主要介绍了Django中shell命令的使用,方便直接在终端中执行测试python语句,有需要的小伙伴可以参考下
    2021-05-05
  • 设置Shell脚本开机自启的方法和实例

    设置Shell脚本开机自启的方法和实例

    这篇文章主要介绍了设置Shell脚本开机自启的方法和实例,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-02-02
  • Linux中文件的基本属性介绍

    Linux中文件的基本属性介绍

    这篇文章介绍了Linux中文件的基本属性,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 分享一个可以通过命令简写执行对应命令的Shell脚本

    分享一个可以通过命令简写执行对应命令的Shell脚本

    这篇文章主要分享了一个可以通过命令简写执行对应命令的Shell脚本,帮助大家更好的理解和使用shell,感兴趣的朋友可以了解下
    2020-12-12
  • 浅谈shell数组的定义及循环

    浅谈shell数组的定义及循环

    今天小编就为大家分享一篇浅谈shell数组的定义及循环,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06

最新评论