如何将一个文件分割成多个较小的文件然后重新构建它们?

如何将一个文件分割成多个较小的文件然后重新构建它们?

我需要将一个大约 1 GB 的文件上传到在线服务器,以便发送给朋友。现在我的互联网连接似乎出现了问题,因为如果我尝试上传超过 20MB 的文件,它就会停止上传,并且由于某种原因不会再次开始。

所以我想要一个应用程序或脚本(可能需要两个,一个用于制作文件,一个用于重建文件),它可以执行以下操作:

  • 将文件拆分成更小的文件,用户可以设置每个文件的最大大小,以便用于其他情况

  • 能够在另一端重建文件并通过检查其 SHA512SUM 来验证完整性

我希望它不压缩任何东西。我正在运行带有 GNOME 3.20 的 Ubuntu GNOME 16.04.1。有办法吗?

答案1

发帖前先查看建议的答案。第一个建议的答案是这个: 将大文件分割成多个小文件,然后整合它们得到原始文件

下面是命令

split -b 20M -d bigfile bigfile-part
cat bigfile-part* > bigfile

编辑:

...对于哈希和部分,您可以从原始(“大”)文件生成 SHA512 校验和文件:

sha512sum bigfile > sha512.txt

将所有小零件重新放在一起后,使用新文件再次检查并比较值。

答案2

我编写了两个可用于此目的的小脚本。首先,将脚本(将其命名为“splitter”或任何你喜欢的名称)放在包含要拆分的文件的单独文件夹中,然后在 bash 中运行:

./splitter FILE SIZE

将要拆分的文件命名为 FILE,并将大小设置为 MB。之后,您将看到所有拆分的块(SPLITTED_FILE.aa、SPLITTED_FILE.ab 等等...)、一个校验和文件(SPLITTED_CHECK_SHA256SUM)和一个包含所有这些文件的 tar 文件(SPLITTED_TAR.tar)。删除除 tar 文件之外的所有内容。当您需要发送它时,请提取它并发送单个文件。一旦它们到达,将它们再次放入同名的 tar 文件中(SPLITTED_TAR.tar),并将其与第二个脚本(“mergefile”或任何您命名的脚本一起放入单独的文件夹中。运行:

./mergefile

它应该提取所有文件,将它们合并到与原始文件同名的文件中并检查 sha256sum。

注意这是一个非常原始的剧本,所以只需按照我描述的方式使用它,在一个单独的文件夹中,里面没有其他任何东西。如果你想使用它,想想在命令行上手动操作更简单..但是我想练习一些 shell 脚本!

分割器脚本:

#!/bin/bash

#Usage: splitter [FILENAME] [SIZE]

PROGRAMNAME=$(basename $0)
PREFIX='SPLITTED_FILE'

if [[ $# != 2 ]]; then
    echo "Usage: $PROGRAMNAME [FILENAME] [SIZE]"
    exit 1
fi

FILENAME=$1
SIZE=$2

if [[ -f $FILENAME ]]; then
    if [[ $SIZE =~ ^[0-9]+$ && $SIZE != 0 ]]; then
        sha256sum $FILENAME > SPLITTED_CHECK_SHA256SUM
        split -b ${SIZE}'M' $FILENAME $PREFIX
        tar -cf SPLITTED_TAR.tar SPLITTED_FILE* SPLITTED_CHECK_SHA256SUM
        echo "Done."
        exit
    else
        echo "$PROGRAMNAME: Invalid size"
        exit 1
    fi
else
    echo "$PROGRAMNAME: Invalid filename"
    exit 1
fi

合并文件脚本:

#!/bin/bash

#Usage: mergefile

PROGRAMNAME=$(basename $0)
PREFIX='SPLITTED_FILE'

if [[ $# != 0 ]]; then
    echo "Usage: $PROGRAMNAME. No arguments (SPLITTED_TAR.tar will be merged)"
    exit 1
fi

FILENAME=""

if [[ -f 'SPLITTED_TAR.tar' ]]; then
    tar -xf 'SPLITTED_TAR.tar'
    FILENAME=$(cut -f 3 -d " " SPLITTED_CHECK_SHA256SUM)
    cat ./SPLITTED_FILE* > $FILENAME
    if [[ $(sha256sum $FILENAME | cut -f 3 -d " ") == $(cut -f 3 -d " " SPLITTED_CHECK_SHA256SUM) ]]; then
        echo "SHASUM Checks!"
    else
        echo "File corrupted (SHASUM doesn't check!)"
        exit 1
    fi
    echo "Done."
    exit
else
    echo "$PROGRAMNAME: SPLITTED_TAR.tar not found."
    exit 1
fi

相关内容