我有一个文件,比如说100MB。我需要将它分成(例如)4个不同的部分。 让我们说第一个文件从0-20MB,第二个20-60MB,第三个60-70MB,最后70-100MB。 但我不想做一个安全的拆分 - 分为4个输出文件。我想这样做。所以输出文件应该在这个源文件占用的硬盘上使用相同的位置,并且字面拆分它,而不进行复制(所以在拆分时,我们应该松开原始文件)。
换句话说,输入文件是输出文件。
这是可能的,如果是的话,怎么样?
我想也许可以手动向文件系统添加一条记录,文件A从此处开始,到此处(在另一个文件的中间),执行4次,然后删除原始文件。但为此,我可能需要管理员权限,对文件系统可能不安全或不健康。
编程语言没关系,我只是感兴趣,如果可能的话。
答案 0 :(得分:3)
这个想法并不像一些评论所描绘的那样疯狂。当然可以有一个支持这种重新解释操作的文件系统API(可以肯定的是,所需的拆分可能不会与块边界完全对齐,但是你可以重新分配那些少数边界块并仍然节省大量的临时空间)。
没有一个常见的文件系统抽象层支持这一点;但回想一下,他们甚至不支持像“插入模式”这样合理的东西(当你在文件的中间插入一些东西而不是所有的块时只会重写一个或两个块),只有覆盖和附加模式。其原因在很大程度上是历史性的,但目前的模式是如此根深蒂固,以至于不太可能在较短时间内使更丰富的API变得普遍。
答案 1 :(得分:1)
正如我在SuperUser的this question中解释的那样,您可以使用Tom Zych在评论中概述的技术来实现这一目标。
bigfile="mybigfile-100Mb"
chunkprefix="chunk_"
# Chunk offsets
OneMegabyte=1048576
chunkoffsets=(0 $((OneMegabyte*20)) $((OneMegabyte*60)) $((OneMegabyte*70)))
currentchunk=$((${#chunkoffsets[@]}-1))
while [ $currentchunk -ge 0 ]; do
# Print current chunk number, so we know it is still running.
echo -n "$currentchunk "
offset=${chunkoffsets[$currentchunk]}
# Copy end of $archive to new file
tail -c +$((offset+1)) "$bigfile" > "$chunkprefix$currentchunk"
# Chop end of $archive
truncate -s $offset "$archive"
currentchunk=$((currentchunk-1))
done
你需要给脚本提供每个块的起始位置(以字节为单位的偏移量,零表示从bigfile
的第一个字节开始的块),按升序排列,就像在第五行一样。
如果需要,使用seq自动化它:以下命令将给出一个chunkoffsets,其中一个块为0,然后一个从100k开始,然后一个为每兆字节,范围为1--10Mb,(注意-1为last
参数,因此被排除在一起,然后每两兆字节一个块,范围为10--20Mb。
OneKilobyte=1024
OneMegabyte=$((1024*OneKilobyte))
chunkoffsets=(0 $((100*OneKilobyte)) $(seq $OneMegabyte $OneMegabyte $((10*OneMegabyte-1))) $(seq $((10*OneMegabyte-1)) $((2*OneMegabyte)) $((20*OneMegabyte-1))))
要查看您设置了哪些块:
for offset in "${chunkoffsets[@]}"; do echo "$offset"; done
0
102400
1048576
2097152
3145728
4194304
5242880
6291456
7340032
8388608
9437184
10485759
12582911
14680063
16777215
18874367
20971519
这种技术的缺点是它至少需要可用的最大块的大小(你可以通过制作更小的块来缓解它,并将它们连接到其他地方)。此外,它将复制所有数据,因此它几乎不是即时的。
关于某些硬件录像机(PVR)设法在几秒钟内分割视频的事实,它们可能只存储每个视频(也称为章节)的偏移列表,并在其用户界面中将这些视频显示为独立视频。 / p>