在Linux下如何将文件剪切为指定大小?

在Linux下如何将文件剪切为指定大小?

我想通过蛮力来缩小文件的大小,也就是说,我不关心其余部分,我只想剪切文件,比如说剪切一半,然后丢弃其余部分。

首先想到的是 Perl 的截短。我按照该页面上的示例做了完全相同的事情:

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

我怎样才能让它工作?

答案1

你可能想要使用截断命令

truncate --size=1G test.txt

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

答案2

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剪切最后 1000 个字节,例如:

tail -c 1000 文件 > 文件2

-C输出文件最后 1000 个字节,更多选项如下:

男人尾巴

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

mv 文件2 文件

答案4

还有一种完全不同的方法可以做到这一点,即使用 bash 中的 ed 程序。以下脚本将仅保留指定目录中所有文件的最后 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

相关内容