【发布时间】:2011-07-03 04:07:54
【问题描述】:
是否可以在 Linux(和/或其他 Unix)中从头开始“收缩”文件?我想将它用于持久队列(没有现有的实现适合我的需要)。从文件末尾我猜它可以使用 truncate()。
【问题讨论】:
-
写完这篇文章后,我开始在谷歌上搜索“截断开头”,看来这是不可能的。
是否可以在 Linux(和/或其他 Unix)中从头开始“收缩”文件?我想将它用于持久队列(没有现有的实现适合我的需要)。从文件末尾我猜它可以使用 truncate()。
【问题讨论】:
如果您使用的是 ext4、xfs 或其他一些现代文件系统,从 Linux Kernel 3.15 起您可以使用:
#include <fcntl.h>
int fallocate(int fd, int mode, off_t offset, off_t len);
带有FALLOC_FL_COLLAPSE_RANGE 标志。
http://manpages.ubuntu.com/manpages/disco/en/man2/fallocate.2.html
【讨论】:
是的,您可以使用cut 或tail 删除文件的某些部分。
cut -b 17- input_filetail -c +17 input_file
这将从第 17 个字节开始输出 input_file 的内容,有效地删除文件的前 16 个字节。请注意,cut 示例还将在输出中添加换行符。
【讨论】:
strace查看上述命令正在执行的系统调用,并且只执行操作的“肉”而不是所有命令行解析等。
我使用以下 Python 脚本将文件截断为 64 000 000 字节的参数:
#!/usr/bin/env python
import sys
import os
file = sys.argv[1]
f = os.open(file, os.O_RDWR)
os.ftruncate(f, 64000000)
os.close(f)
【讨论】: