![如何将一个文件分割成多个较小的文件然后重新构建它们?](https://linux22.com/image/1138690/%E5%A6%82%E4%BD%95%E5%B0%86%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E5%88%86%E5%89%B2%E6%88%90%E5%A4%9A%E4%B8%AA%E8%BE%83%E5%B0%8F%E7%9A%84%E6%96%87%E4%BB%B6%E7%84%B6%E5%90%8E%E9%87%8D%E6%96%B0%E6%9E%84%E5%BB%BA%E5%AE%83%E4%BB%AC%EF%BC%9F.png)
我需要将一个大约 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