我指的是如何连接两个大容量的文件,而且磁盘空间非常小?
我正在执行以下操作:
我想知道是否有谁能够“截断”在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
说明:
从文件中除去最后的10000行
sed -i 1,$(($(wc -l <path / to / file)-10000))d path / to / file