如何在Linux下将文件切成给定大小?


19

我想通过蛮力来缩小文件的大小,也就是说,我不在乎其余的,我只想将文件切成一半,然后丢弃其余的。

首先想到的是Perl的truncate。我按照该页面上的示例进行操作,并且做的完全相同:

seq 9 > test.txt
ls -l test.txt
perl -we 'open( FILE, "< ./test.txt" ) && truncate( FILE, 8 ) && close(FILE);'

但是文件仍然具有相同的大小:

$ ls -lgG test.txt
-rw-rw---- 1 18 2013-08-08 09:49 test.txt

我该如何进行这项工作?

Answers:



21
perl -we 'open( FILE, "< ./test.txt" ) && truncate( FILE, 8 ) && close(FILE);'

打开文件进行读取。但是,要截断文件,您需要对其进行修改,因此只读文件句柄将无法工作。您需要使用“修改”模式("+>")。

作为附带问题,当人们让系统调用静默失败然后问出什么问题时,这总是让我感到惊讶。诊断问题的重要部分是查看产生的错误消息。即使您不了解它,也可以使寻求帮助的人的生活变得更加轻松。

以下内容可能会有所帮助:

perl -we 'open(FILE, "<", "./test.txt") or die "open: $!";
          truncate(FILE, 8) or die "truncate: $!";
          close(FILE);'

尽管应该承认,只会报告“无效的论点”。尽管如此,这还是有用的信息,并且很可能导致您得出以下结论:开放模式是错误的(对我而言是如此)。


3

您可以tail用来削减最后100000个字节,例如:

tail -c 100000文件> file2

-c输出文件的最后100000字节,以获得更多选项:

男子尾巴

要将原始文件替换为刚生成的文件,请执行以下操作:

mv file2文件


2

上面引用截断的答案很好。dd也可以做:

dd if=test.txt of=test2.txt bs=1 count=8
mv test2.txt test.txt

1
关键短语是“给定大小”,例如1000。我将答案改为投票最多的答案,它可以即时输入-无需中间文件。
xpt

0

使用ed程序,使用bash有完全不同的方法。以下脚本将仅保留位于指定目录中的所有文件的最后5000行。可以轻松地对其进行修改以遍历多个目录,更改行数等。

#!/bin/bash

LOGDIR=/opt/log
SAVELINES=5000

dirs="$LOGDIR"
for dir in $dirs ; do
    files=${dir}/*
    for f in $files ; do
        echo -e "1,-${SAVELINES}d\nwq" | ed $f 1>/dev/null 2>&1
    done
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.