在Linux(和/或其他Unix系统)中,是否可能从文件开头“收缩”文件?我想用它来实现持久队列(没有现有的实现满足我的需求)。我猜从文件末尾使用truncate()函数是可能的。
如果你使用的是ext4、xfs或其他现代文件系统,自从Linux内核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/zh_CN/man2/fallocate.2.html
您可以尝试使用 ex 删除一半的日志,但速度可能不如我所愿(5GB 的日志需要很长时间):
ex -s -c "1d$(( $(wc -l /var/log/messages | awk '{ print $1 }') / 2 ))|x" /var/log/messages
是的,您可以使用cut
或tail
来删除文件的部分内容。
cut -b 17- input_file
tail -c +17 input_file
这将输出从第17个字节开始的input_file内容,有效地删除文件的前16个字节。请注意,cut
示例还会向输出添加一个换行符。
strace
查看上述命令执行的系统调用,并仅执行操作的“核心”,而不是所有命令行解析等。 - MikeK