【问题标题】:shrink (truncate) file from beginning on linux在 linux 上从头开始收缩(截断)文件
【发布时间】:2011-07-03 04:07:54
【问题描述】:

是否可以在 Linux(和/或其他 Unix)中从头开始“收缩”文件?我想将它用于持久队列(没有现有的实现适合我的需要)。从文件末尾我猜它可以使用 truncate()。

【问题讨论】:

  • 写完这篇文章后,我开始在谷歌上搜索“截断开头”,看来这是不可能的。

标签: file truncate shrink


【解决方案1】:

如果您使用的是 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

【讨论】:

    【解决方案2】:

    是的,您可以使用cuttail 删除文件的某些部分。

    cut -b 17- input_file
    tail -c +17 input_file

    这将从第 17 个字节开始输出 input_file 的内容,有效地删除文件的前 16 个字节。请注意,cut 示例还将在输出中添加换行符。

    【讨论】:

    • 我对通过一些系统调用有效地就地更新文件很感兴趣。你建议的不是它。
    • 在这种情况下,您可以通过strace查看上述命令正在执行的系统调用,并且只执行操作的“肉”而不是所有命令行解析等。
    【解决方案3】:

    我使用以下 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)
    

    【讨论】:

    • 那是要砍掉文件的结尾,OP专门问要砍掉文件的开头。
    猜你喜欢
    • 2015-11-29
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 2022-12-10
    相关资源
    最近更新 更多