我想通过蛮力来缩小文件的大小,也就是说,我不关心其余部分,我只想剪切文件,比如说剪切一半,然后丢弃其余部分。
首先想到的是 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