在Linux中截断文件的前100MB

我指的是如何连接两个大容量的文件,而且磁盘空间非常小?

我正在执行以下操作:

  1. 分配合并大小的稀疏文件。
  2. 从第二个文件的末尾复制100Mb到新文件的末尾。
  3. 截断100Mb的第二个文件的末尾
  4. 循环2和3,直到完成第二个文件(使用2.修改到目标文件中的正确位置)。
  5. 做2&3&4,但与第一个文件。

我想知道是否有谁能够“截断”在Linux中给定的文件? 截断是由文件大小,例如,如果文件是10GB,我想截断文件的前100MB,并保留文件与剩余的9.9GB。 任何人都可以帮忙吗?

谢谢

回答,现在用Linux内核v3.15(ext4 / xfs)

在这里阅读http://man7.org/linux/man-pages/man2/fallocate.2.html

测试代码

 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #ifndef FALLOC_FL_COLLAPSE_RANGE #define FALLOC_FL_COLLAPSE_RANGE 0x08 #endif int main(int argc, const char * argv[]) { int ret; char * page = malloc(4096); int fd = open("test.txt", O_CREAT | O_TRUNC | O_RDWR, 0644); if (fd == -1) { free(page); return (-1); } // Page A printf("Write page A\n"); memset(page, 'A', 4096); write(fd, page, 4096); // Page B printf("Write page B\n"); memset(page, 'B', 4096); write(fd, page, 4096); // Remove page A ret = fallocate(fd, FALLOC_FL_COLLAPSE_RANGE, 0, 4096); printf("Page A should be removed, ret = %d\n", ret); close(fd); free(page); return (0); } 

对大多数文件系统来说,删除一个文件的开头是不可能的,而且没有通用的API来完成; 例如truncate函数只能修改文件的结尾。

尽管你可以用一些文件系统来完成。 例如ext4文件系统最近有一个你可能会觉得有用的ioctl: http : //lwn.net/Articles/556136/

请阅读一本好的Linux编程书籍,例如高级Linux编程 。

您需要使用Linux内核 系统调用 ,请参阅系统调用(2)

特别是truncate(2) (用于截断,以及在支持它的文件系统上扩展稀疏文件)和stat(2)显着获取文件大小。

没有(可移植的或文件系统中立的)方法从文件的开始(或中间)删除字节,只能在文件末尾截断文件。

如果您可以使用ASCII行而不是字节,那么删除文件的前n行很容易。 例如,要删除前100行:

 sed -i 1,100d /path/to/file 

到现在为止,这是一个相当古老的问题,但这是我的承诺。 不包括在有限的可用空间下完成它的要求,我将使用类似于以下内容的截断文件的前100mb:

 $ tail --bytes=$(expr $(wc -c < logfile.log) - 104857600) logfile.log > logfile.log.tmp $ mv logfile.log.tmp logfile.log 

说明:

  • 这将输出文件的最后nn个字节(尾字节)。
  • 要输出的文件中的字节数以文件大小(wc -c <logfile.log)减去100Mb(expr $(…) – 104857600)计算。 这会使我们的文件大小小于100Mb(例如9.9Gb)
  • 然后将其输出到临时文件,然后移回原始文件名以保留截断的文件。

从文件中除去最后的10000行

sed -i 1,$(($(wc -l <​​path / to / file)-10000))d path / to / file