AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 410649
Accepted
Tomilov Anatoliy
Tomilov Anatoliy
Asked: 2017-12-14 06:10:27 +0800 CST2017-12-14 06:10:27 +0800 CST 2017-12-14 06:10:27 +0800 CST

tar 目录只发送修改过的文件块

  • 772

可以修改深度和复杂的目录结构:可以移动文件(更改前缀),同时可以部分更改文件的内容。

我想减少通过网络传输的数据量。

rsync适用于 4k 大小的数据块(如果我没记错的话)。

我可以使用某种连接(tar-like)保留有关文件系统结构和属性的元信息,它将文件的内容从每个下一个文件的多个 4k 字节的偏移量开始放置以启用rsync算法优势?

我要解决的问题是遗漏rsync:它无法检测文件内容是否更改并且文件是否在同步之间同时移动,以使用目标文件的匹配块来减少数据传输。

rsync tar
  • 3 3 个回答
  • 1197 Views

3 个回答

  • Voted
  1. Best Answer
    roaima
    2017-12-14T13:38:13+08:002017-12-14T13:38:13+08:00

    根据您在评论中的建议(这确实应该在您的问题中),这似乎是您想要的

    cd /path/to/directory
    tar cf /var/tmp/directory.tar .
    rsync -azv /var/tmp/directory.tar remote:/var/tmp/directory.tar
    ssh remote 'cd /path/to/destination && tar xf /var/tmp/directory.tar'
    

    您需要足够的空间来存放directory.tar两侧。


    我被问到这个看似微不足道的解决方案是否可以在从 tar 文件的开头添加(或删除)少量(例如单个字节)的情况下工作。

    希望这个示例能够说明rsync处理此类情况的能力。如果您有远程服务器的等效(证书密钥)登录名,则效果最好,这样就不会花时间输入密码。

    # Generate some data
    dd iflag=fullblock bs=1M count=200 </dev/urandom >200M.dat
    
    # See how long it takes to transfer
    time rsync -av 200M.dat remote:
    
    # See how long it takes to transfer "nothing"
    time rsync -av 200M.dat remote:
    
    # Generate one byte of data and prepend it to another data file
    dd bs=1 count=1 </dev/urandom >1b.dat
    cat 1b.dat 200M.dat >200M1b.dat
    
    # Copy the new file across to the original target
    time rsync -av 200M1b.dat remote:200M.dat
    
    # Clean up
    rm 1b.dat 200M.dat 200M1b.dat
    ssh remote rm 200M.dat
    

    如果算法可以处理插入在数据流开头的单个字节,则传输应该只需要几分钟。如果不能,您会期望传输时间与第一次大致相似。

    • 2
  2. roaima
    2017-12-16T02:02:52+08:002017-12-16T02:02:52+08:00

    这是给你的另一个建议。我在 GitHub 上找到的该hrsync工具似乎非常适合在您重命名文件或在源代码树的目录之间移动文件时维护文件的内存。

    • 它可以跟踪源树中文件的移动和编辑
    • 它是一个 shell 脚本,不需要管理权限即可在源系统上安装,尽管将其放入/usr/local/bin确实有优势
    • 它要求本地和远程系统都有一个能够处理硬链接的文件系统
    • 它无法跟踪对该文件进行重命名和替换的文件的更改(即删除然后重新创建,而不是就地编辑)

    例子

    hrsync /path/to/directory/ remote:/path/to/destination/
    
    • 1
  3. Tomilov Anatoliy
    2017-12-15T01:20:47+08:002017-12-15T01:20:47+08:00

    我bash仅使用命令行实用程序找到了解决方案。可以优化解决方案:按大小升序对文件进行排序,并在每个块中放置尽可能多的小文件(这里是背包问题=),但这会过度设计):

    pack.bash:

    #! /usr/bin/env bash
    
    set -e
    
    [[ -d "$1" ]]
    [[ -d "$( dirname '$2' )" ]]
    
    BLOB="$2.blob"
    FSIZES="$2.sizes"
    OFFSET=0
    
    shopt -s globstar
    for f in "$1"/* "$1"/**/*
    do
        if [[ -f "$f" ]]
        then
            SIZE=$( stat -c %s "$f" )
            echo "$SIZE" >> "$FSIZES"
            COUNT=$(( ($SIZE + 4096 - 1) / 4096 ))
            dd if="$f" of="$BLOB" bs=4096 seek=$OFFSET count=$COUNT conv=notrunc
            OFFSET=$(( $COUNT + $OFFSET ))
        fi
    done
    
    cp --recursive --archive --attributes-only "$1" "$2.dir"
    XZ_OPT="-9e --threads=$(( $( nproc ) + 1 ))" tar cpJf "$2.tar.xz" -C "$2.dir" .
    rm --recursive "$2.dir"
    

    unpack.bash:

    #! /usr/bin/env bash
    
    set -e
    
    BLOB="$2.blob"
    FSIZES="$2.sizes"
    
    [[ -f "$BLOB" ]]
    [[ -f "$FSIZES" ]]
    
    mkdir --parents "$1"
    [[ ! "$( ls -A '$1' )" ]]
    
    tar xpJf "$2.tar.xz" -C "$1"
    
    SIZES=($( < "$FSIZES" ))
    
    i=0
    OFFSET=0
    shopt -s globstar
    for f in "$1"/* "$1"/**/*
    do
        if [[ -f "$f" ]]
        then
            SIZE=${SIZES[i]}
            dd if="$BLOB" of="$f" bs=4096 skip=$OFFSET count=$SIZE iflag=count_bytes
            OFFSET=$(( $OFFSET + ($SIZE + 4096 - 1) / 4096 ))
            i=$(( $i + 1 ))
        fi
    done
    
    • 0

相关问题

  • 如何复制具有相对重复符号链接的目录树?

  • 在 Solaris 上;查找、附加到 tar 球并压缩问题

  • bsdtar:如何避免覆盖现有文件信息?

  • rsync 排除问题

  • rsync 端口 22 和 873 使用

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    JSON数组使用jq来bash变量

    • 4 个回答
  • Marko Smith

    日期可以为 GMT 时区格式化当前时间吗?[复制]

    • 2 个回答
  • Marko Smith

    bash + 通过 bash 脚本从文件中读取变量和值

    • 4 个回答
  • Marko Smith

    如何复制目录并在同一命令中重命名它?

    • 4 个回答
  • Marko Smith

    ssh 连接。X11 连接因身份验证错误而被拒绝

    • 3 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Marko Smith

    systemctl 命令在 RHEL 6 中不起作用

    • 3 个回答
  • Marko Smith

    rsync 端口 22 和 873 使用

    • 2 个回答
  • Marko Smith

    以 100% 的利用率捕捉 /dev/loop -- 没有可用空间

    • 1 个回答
  • Marko Smith

    jq 打印子对象中所有的键和值

    • 2 个回答
  • Martin Hope
    EHerman JSON数组使用jq来bash变量 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux 日期可以为 GMT 时区格式化当前时间吗?[复制] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC 如何复制目录并在同一命令中重命名它? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve “root”用户的文件权限如何工作? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey 如何下载软件包而不是使用 apt-get 命令安装它? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao 为什么目录 /home、/usr、/var 等都具有相同的 inode 编号 (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg —list-keys 命令在将私钥导入全新安装后输出 uid [未知] 2017-11-26 18:26:02 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve