如何拆分大文件并在完成每个拆分时执行命令

时间:2011-03-28 21:08:09

标签: linux bash split

操作系统:LINUX

所以我的情况是,我通常使用超过30 GB的gz文件,使用拆分将其拆分为2GB,然后将每个拆分推送到S3。

不幸的是现在我运行拆分,然后当它完成时我会并行移动每个拆分。

我想拆分并在第一部分文件写完后立即执行push命令并对每个部件文件执行相同的操作。这样可以节省我的时间,减少我充斥系统传出频段的时间。

无论如何,我在分裂时寻找--exec或类似的东西,它就不存在了。我可以并且会编写一个脚本来观看拆分目录并采取相应行动,但我想我会问是否有人已经执行了这项我不知道的命令。

提前致谢。

1 个答案:

答案 0 :(得分:1)

您可以使用带dd的循环

#gen a test file
dd if=/dev/urandom bs=1K count=1024 of=test.bin
sourcefile="test.bin"

这应该很容易解释(bash假设):

bsize=$((128*1024))
flength=$(stat --printf=%s "$sourcefile")
for i in $(seq 0 $((($flength-1) / $bsize))); do dd if="$sourcefile" bs=$bsize skip=$i count=1 2>/dev/null; done | md5sum

# verify    
md5sum "$sourcefile"

for i in $(seq $RANDOM); do echo hello >> "$sourcefile"; done
flength=$(stat --printf=%s "$sourcefile")
for i in $(seq 0 $((($flength-1) / $bsize))); do dd if="$sourcefile" bs=$bsize skip=$i count=1 2>/dev/null; done | md5sum

# verify    
md5sum "$sourcefile"

在我的系统上,这就像一个魅力,产生以下输出

1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 0.27551 s, 3.8 MB/s
d73c5a920dae16861983c95d8fb1e94b  -
d73c5a920dae16861983c95d8fb1e94b  test.bin
d14ae9ae62652bc7768b076226a6320a  -
d14ae9ae62652bc7768b076226a6320a  test.bin

我将暂时将信息传递给您的网络工作。 看看mkfifo,将每个子作业重定向到一个单独的fifo,并且如果它具有任何值(通常带宽是限制因素),可能使用xargs -PN来分割并行作业。