删除文件数据的 X%? (文件的部分无效)

删除文件数据的 X%? (文件的部分无效)

有没有办法最多删除文件的 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其他实现将拒绝工作)。catcat

或者使用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"

相关内容