如何在不读取整个文件的情况下从大文件末尾删除X字节?

时间:2011-09-12 18:48:09

标签: linux shell

在Linux中,我有一个相当大的文件,其中包含一些无关的信息。比方说,我知道在1.6GB文件的末尾有314个字节的无关数据。

当然,将更多数据添加到文件末尾非常简单有效,但是我可以做什么来删除它而不必将该文件的第一部分复制到另一部分(或覆盖所述文件)? / p>

修改

我在C中看到了一些很好的建议。我希望从命令行编写脚本,但如果没有,我会更倾向于在python中执行它而不是C.

我看到python在其文件对象上有一个截断方法,但无论我如何使用它,它似乎都在拆除我的文件 - 我应该能够解决这个问题,但当然答案仍然非常受欢迎

5 个答案:

答案 0 :(得分:28)

使用函数truncate

http://linux.die.net/man/2/truncate

int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length); 

truncate取文件名
ftruncate采用打开的文件描述符

这两个文件都将文件长度设置为length,因此它会截断或拉长(在后一种情况下,文件的其余部分将填充NULL / ZERO)

<强> [编辑]
truncate(linux shell命令)也可以工作

**SYNTAX**

truncate -s integer <filename>  
**OPTIONS**

-s number specify the new file length. If the new length is smaller than the current filelength data is lost. If the new length is greater the file is padded with 0. You can specify a magnitude character to ease large numbers:
b or B size is bytes.
k size is 1000 bytes.
K size is 1024 bytes.
m size is 10^6 bytes.
M size is 1024^2 bytes.
g size is 10^9 bytes.
G size is 1024^3 bytes.


**EXAMPLES**

To shrink a file to 10 bytes:

truncate -s 10 /tmp/foo

To enlarge or shrink a file to 345 Megabytes:

truncate -s 345M /tmp/foo

<强> [/编辑]

答案 1 :(得分:15)

尽管在这个帖子中有很多对truncate函数的引用,但没有人真正回答OP关于从脚本环境中将文件减少固定数量的问题。 Kevin的回答使用truncate将目标文件的大小调整为固定数量,但当然这个解决方案的正确性要求用户首先知道目标文件的大小减去最后的无关数据。所以,我们有:

   -s, --size=SIZE
          set or adjust the file size by SIZE bytes

Truncate实际上支持通过在SIZE前加-个字符来直接从目标文件的末尾删除数据。

例如,要将文件大小调整为314字节,您可以执行以下操作:

truncate --size=-314 target_file.bin

答案 2 :(得分:4)

答案 3 :(得分:4)

使用“truncate”是最好的方法,我只是发布一些例子:

  1. 我有一个文件“PNav-h.db”,它有50176个字节。

    -rw-r--r--  1 user user 50176 Mar  8 23:43 PNav-h.db
     $truncate -s 1000 PNav-h.db
    

    它将文件大小设置为1000 byptes

     -rw-r--r--  1 user user  1000 Mar  9 00:02 PNav-h.db
    
  2. 对于您的情况,请使用$truncate --size=xxx xxfilename,使用-<size number>缩小文件大小

    $truncate --size=-300 PNav-h.db
    -rw-r--r--  1 user user   700 Mar  9 00:07 PNav-h.db
    

    最终文件大小= 1000-300 = 700

  3. 使用+<size number>增加文件大小

    $truncate --size=+500 PNav-h.db
    -rw-r--r--  1 user user  1200 Mar  9 00:09 PNav-h.db
    

    最终文件大小= 700 + 500 = 1200

  4. 如果没有-+,则设置文件大小。

    $truncate --size=60000 PNav-h.db
    -rw-r--r--  1 user user 60000 Mar  9 00:12 PNav-h.db 
    

    最终文件大小设置为60000

答案 4 :(得分:2)

在符合POSIX标准的系统(或更常见的大多数类Unix系统)上的C中,您可以使用truncateftruncate函数。