有没有办法最多删除文件的 75%,以便只有最后(或前)25% 的内容保留在文件中?
我可以使整个文件无效,cat /dev/null > /var/mail/root
但在这种情况下,我只需要删除(无效)该文件的最多 75%。
Bash 有办法吗?我发现的所有文档都谈到了使用上面的命令 100% 无效。
答案1
要使用 GNU 将文件截断到 75%,truncate
您可以执行以下操作:
size=$(wc -c < "$file") &&
truncate -s "$((size * 75 / 100))" -- "$file"
和ksh93
:
<>; $file >#((EOF * 75 / 100))
要删除前导部分,通常需要重写文件的内容。您可以通过将文件写入自身来完成此操作ksh93
:
command /opt/ast/bin/cat < $file <#((EOF * 25 / 100)) <>; $file
(这里使用 的ksh93
内置命令,因为如果它们的标准输出引用与标准输入相同的文件,像 GNU 这样的cat
其他实现将拒绝工作)。cat
cat
或者使用perl
:
perl -pe '
BEGIN{
seek(STDIN,0,2) or die$!;
seek(STDIN,tell(STDIN)*75/100,0) or die$!;
$/ = \65536
}
END{truncate STDOUT, tell STDOUT}' < "$file" 1<> "$file"
在 Linux 和某些文件系统上,您可以删除文件末尾以外的部分而不重写它,但只能以文件系统块大小的倍数为单位。对于大文件,这可能就足够了:
block_size=$(stat -Lc %o -- "$file") &&
size=$(wc -c < "$file") &&
fallocate -cl "$((size * 25 / 100 / block_size * block_size)) -- "$file"