在 Linux 上从头开始收缩(截断)文件

发布于 2024-10-18 22:59:22 字数 93 浏览 5 评论 0原文

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

Is it possible in Linux (and/or on other Unix) 'shrink' file from beginning? I'd like to use it for persistent queue (no existing implementation suits my needs). From end of file I guess it's possible with truncate().

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

埖埖迣鎅 2024-10-25 22:59:22

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

If you are using ext4, xfs or some other modern file system, since Linux Kernel 3.15 you can use:

#include <fcntl.h>

int fallocate(int fd, int mode, off_t offset, off_t len);

with the FALLOC_FL_COLLAPSE_RANGE flag.

http://manpages.ubuntu.com/manpages/disco/en/man2/fallocate.2.html

又爬满兰若 2024-10-25 22:59:22

您可以尝试使用 ex 删除一半日志,但它没有我想要的那么快(5GB 日志需要很长时间):

ex -s -c "1d$(( $(wc -l /var/log/messages | awk '{ print $1 }') / 2 ))|x" /var/log/messages

You can try dropping half of logs using ex, but it is not as fast as I would like (5GB of logs takes ages):

ex -s -c "1d$(( $(wc -l /var/log/messages | awk '{ print $1 }') / 2 ))|x" /var/log/messages
那小子欠揍 2024-10-25 22:59:22

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

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

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

Yes, you can use cut or tail to remove portions of a file.

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

This will output the contents of input_file starting at the 17th byte, effectively removing the first 16 bytes of the file. Note that the cut example will also add a newline to the output.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文