Para truncar um arquivo em 75%, com GNU truncate
, você poderia fazer:
size=$(wc -c < "$file") &&
truncate -s "$((size * 75 / 100))" -- "$file"
com ksh93
:
<>; $file >#((EOF * 75 / 100))
Para remover uma parte principal, geralmente, você precisa reescrever o conteúdo do arquivo. Você poderia fazer isso escrevendo o arquivo sobre si mesmo em ksh93
com:
command /opt/ast/bin/cat < $file <#((EOF * 25 / 100)) <>; $file
(aqui usando o comando ksh93
'builtin cat
' como outras implementações de cat
como o GNU cat
se recusarão a funcionar se o stdout se referir ao mesmo arquivo que o stdin).
Ou use perl
:
perl -pe '
BEGIN{
seek(STDIN,0,2) or die$!;
seek(STDIN,tell(STDIN)*75/100,0) or die$!;
$/ = 536
}
END{truncate STDOUT, tell STDOUT}' < "$file" 1<> "$file"
No Linux e em alguns sistemas de arquivos, você pode remover partes de um arquivo que não sejam no final sem reescrevê-lo, mas apenas em múltiplos do tamanho de bloco do sistema de arquivos. Para arquivos grandes, isso pode ser bom o suficiente:
block_size=$(stat -Lc %o -- "$file") &&
size=$(wc -c < "$file") &&
fallocate -cl "$((size * 25 / 100 / block_size * block_size)) -- "$file"