Excluindo a porcentagem X dos dados de um arquivo? (anulação parcial de um arquivo)

1

Existe uma maneira de deletar somente até 75% de um arquivo para que somente o último (ou primeiro) 25% dele permaneça no arquivo?

Eu posso anular um arquivo inteiro com cat /dev/null > /var/mail/root , mas neste caso eu preciso excluir (anular) somente até 75% desse arquivo.

Existe alguma maneira com o Bash? Todos os documentos que encontrei falaram sobre a anulação de 100% com o comando acima.

    
por JohnDoea 21.07.2017 / 17:12

1 resposta

4

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"
    
por 21.07.2017 / 17:52

Tags