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

xpt*_*xpt 29 linux shell perl ubuntu

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

首先想到的是 Perl 的truncate。我正在关注该页面上的示例并做了完全相同的事情:

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

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

$ ls -lgG test.txt
-rw-rw---- 1 18 2013-08-08 09:49 test.txt
Run Code Online (Sandbox Code Playgroud)

我怎样才能使这项工作?

Chr*_*ton 77

您可能需要使用truncate 命令

truncate --size=1G test.txt
Run Code Online (Sandbox Code Playgroud)

SIZE 可以指定为字节、KB、K、MB、M 等。我假设您可以手动计算所需的大小;如果没有,您可能可以使用 stat 命令来获取有关文件当前大小的信息。

  • 需要注意的是,如果文件较小,给定的测试文件将扩展到 1G 大小。 (2认同)

ric*_*ici 21

perl -we 'open( FILE, "< ./test.txt" ) && truncate( FILE, 8 ) && close(FILE);'
Run Code Online (Sandbox Code Playgroud)

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

作为一个附带问题,当人们让系统调用无声地失败然后询问出了什么问题时,它总是让我感到惊讶。诊断问题的一个重要部分是查看产生的错误消息;即使你不理解它,它也会让你寻求帮助的人的生活变得更轻松。

以下内容会更有帮助:

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

尽管无可否认,那只会报告“无效论点”。尽管如此,这是有用的信息,很可能会让您得出开放模式错误的结论(就像我所做的那样)。


Iva*_*hev 11

您可以使用tail剪切最后 1000 个字节,例如:

tail -c 1000 文件 > 文件 2

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

人尾

用刚生成的文件替换原始文件:

mv 文件 2 文件

  • 这个很好,但我认为 OP 想要文件的开头,所以我会使用 `head` 代替: ```head -c 1000 file &gt; file2 &amp;&amp; mv file2 file``` (2认同)