Linux / Comando truncate: reduzir e aumentar o tamanho de arquivos
O comando GNU truncate reduz ou aumenta o tamanho lógico de arquivos. Reduzir descarta o trecho após o novo fim; aumentar faz a região acrescentada ser lida como bytes zero, podendo deixar espaços sem blocos alocados, chamados de regiões esparsas. Aumentar novamente um arquivo não recupera os bytes que foram cortados.
Os exemplos usam Bash e GNU Coreutils em uma pasta temporária própria. Confira truncate --version, truncate --help e man truncate no sistema de destino. Execute a preparação no mesmo terminal e pare se uma etapa falhar. Não troque os arquivos de prática por logs de serviços, imagens em uso ou dados importantes.
O que é o comando truncate?
truncate muda o fim lógico do arquivo; não copia um conteúdo de referência nem constrói um formato interno válido. Por padrão, cria arquivos ausentes. -c evita essa criação, mas um arquivo ausente ignorado pode ainda resultar em sucesso, portanto consulte a existência e o tamanho quando isso importar. O manual GNU de truncate descreve as opções e os modificadores de tamanho.
Sintaxe básica
truncate [opções]... arquivo...
opções e arquivo são marcadores. Informe o tamanho com -s ou uma referência com -r. Use aspas nos caminhos e -- antes dos nomes. Prefixos como < e > precisam de aspas para não virarem redirecionamentos do shell. Use apenas arquivos regulares conhecidos, sem links simbólicos inesperados nem alterações concorrentes.
Uso básico do truncate
Esvaziar um arquivo de demonstração
A cadeia abaixo cria uma área exclusiva e prepara entradas pequenas, uma cópia independente e um arquivo de controle. application.log é apenas um arquivo criado nesta prática; não pertence a um serviço. -s 0 deixa o nome existente com comprimento zero. A consulta deve mostrar 0 application.log. Os arquivos restantes ficam disponíveis para inspeção, sem limpeza recursiva.
truncate_start=$PWD
truncate_demo=$(mktemp -d -p "$PWD" 'truncate-demo.XXXXXXXX') &&
cd -- "$truncate_demo" &&
printf 'log de teste\n' > application.log &&
printf 'ABCDEFGH' > data.bin &&
cp -- data.bin data.backup &&
printf '12345678' > reference.img &&
printf 'abc' > target.img &&
printf '0123456789ABCDEF' > cache.bin &&
printf 'p' > placeholder.bin &&
printf 'controle intacto\n' > sentinel.txt &&
truncate -s 0 -- application.log &&
stat -c '%s %n' -- application.log
Criar arquivos com tamanho lógico definido
Sem sufixo, o número significa bytes. No GNU, 1M e 1MiB significam 1.048.576 bytes, enquanto 1MB significa 1.000.000 bytes. Da mesma forma, 1G ou 1GiB representam 1.073.741.824 bytes. A prática usa tamanhos menores: a saída esperada é 1048576 test.img e 2097152 sparse.img. O nome .img não transforma o arquivo em um sistema de arquivos ou imagem inicializável.
cd -- "$truncate_demo" &&
truncate -s 1M -- test.img &&
truncate -s 2MiB -- sparse.img &&
stat -c '%s %n' -- test.img sparse.img
Aumentar ou reduzir em relação ao tamanho atual
+ acrescenta e - subtrai o valor do tamanho atual. O arquivo data.bin foi preparado com oito bytes ASCII. A primeira operação o leva a 12 bytes; a segunda, a 10. Cada execução é relativa: repetir os comandos volta a alterar o tamanho. Os oito bytes iniciais permanecem nesta sequência, seguidos de dois bytes zero.
cd -- "$truncate_demo" &&
test -f data.bin && test ! -L data.bin &&
truncate -s +4 -- data.bin &&
stat -c '%s %n' -- data.bin &&
truncate -s -2 -- data.bin &&
stat -c '%s %n' -- data.bin
Verificar tamanho e perda de conteúdo
O GNU normalmente fica silencioso quando tem sucesso. A primeira parte abaixo esvazia um arquivo separado e mostra 0 demo.txt. A segunda reduz restore-demo.bin de oito para quatro bytes e depois o amplia novamente para oito, usando od para visualizar cada byte em hexadecimal.
cd -- "$truncate_demo" &&
printf 'abc' > demo.txt &&
truncate -s 0 -- demo.txt &&
stat -c '%s %n' -- demo.txt &&
printf 'ABCDEFGH' > restore-demo.bin &&
truncate -s 4 -- restore-demo.bin &&
truncate -s 8 -- restore-demo.bin &&
od -An -tx1 -- restore-demo.bin
O resultado hexadecimal esperado termina em 41 42 43 44 00 00 00 00: ABCD foi preservado, mas EFGH não voltou. Restaurar o comprimento não restaura o conteúdo. Uma cópia de segurança válida pode permitir restauração, mas truncate não oferece desfazer. Essa perda na visão lógica também não comprova apagamento físico seguro de células, snapshots ou backups; veja os limites da sobrescrita com shred.
Principais opções
| Opção | Efeito e condição |
|---|---|
-s TAMANHO, --size=TAMANHO |
Definir o comprimento ou ajustá-lo conforme um prefixo. Sem -o, a unidade básica é byte. |
-c, --no-create |
Não criar um arquivo ausente. Não é uma confirmação de existência. |
-r ARQUIVO, --reference=ARQUIVO |
Usar o tamanho da referência; não copiar os bytes nem seus metadados. |
-o, --io-blocks |
Interpretar o tamanho em unidades do bloco de entrada/saída do arquivo, não em bytes nem na unidade de contagem de blocos alocados. |
Além de + e -, os prefixos < e > impõem máximo e mínimo. / arredonda para baixo e % para cima até um múltiplo do valor; por exemplo, um arquivo de dez bytes passa a oito com -s /4 e a 12 com -s %4. -o usa o bloco de entrada/saída, que pode variar por arquivo e sistema: consulte stat -c %o, em vez de presumir que ele mede 512 bytes. Confira as opções quando precisar executar fora do GNU.
Exemplos práticos
Usar apenas o tamanho de uma referência
A preparação criou reference.img com oito bytes 12345678 e target.img com três bytes abc. Depois de -r, ambos têm oito bytes, mas o destino contém abc e cinco bytes zero, não os números da referência. A visualização deve mostrar 61 62 63 00 00 00 00 00. A referência não é modificada por esta operação.
cd -- "$truncate_demo" &&
truncate -r reference.img -- target.img &&
stat -c '%s %n' -- reference.img target.img &&
od -An -tx1 -- target.img
Aplicar tamanho máximo ou mínimo
<8 reduz o arquivo somente se ele estiver maior que oito bytes; >8 amplia somente se ele estiver menor. cache.bin começa com 16 bytes e placeholder.bin com um. As consultas devem mostrar oito bytes para cada um. Repetir estes limites não muda novamente o comprimento quando ele já está no limite. Uma redução ainda descarta dados, mesmo que seja expressa como máximo.
cd -- "$truncate_demo" &&
truncate -s '<8' -- cache.bin &&
truncate -s '>8' -- placeholder.bin &&
stat -c '%s %n' -- cache.bin placeholder.bin
Comparar tamanho lógico e espaço alocado
A região ampliada pode ser um espaço esparso: ela é lida como zeros sem necessariamente ter todos os blocos físicos atribuídos. Na prática, o primeiro campo de stat deve mostrar size=8388608, pois 8M equivale a 8.388.608 bytes. Os demais valores dependem do sistema de arquivos, da implementação e da alocação anterior; não há uma saída universal de uso físico.
cd -- "$truncate_demo" &&
truncate -s 8M -- sparse.img &&
stat -c 'size=%s blocks=%b block_bytes=%B io_block=%o' -- sparse.img &&
du --block-size=1 -- sparse.img &&
du --apparent-size --block-size=1 -- sparse.img
No comando stat, %s é o tamanho lógico, %b conta blocos alocados e %B informa quantos bytes cada bloco dessa contagem representa. Não confunda essa unidade com %o, o bloco preferido de entrada/saída. No GNU du, a primeira consulta mostra uso alocado em bytes; --apparent-size mostra tamanho aparente. Um arquivo pode ter valores próximos ou muito diferentes; reservar espaço físico para gravações futuras é uma necessidade distinta de apenas aumentar o comprimento.
Comparar truncate e outros comandos
| Comando ou método | Função principal | Quando usar |
|---|---|---|
truncate |
Alterar o fim lógico do arquivo | Definir comprimentos e, quando suportado, criar regiões esparsas |
touch |
Criar arquivo ausente ou atualizar horários | Manter o conteúdo e tamanho de um arquivo existente |
dd |
Copiar e transformar fluxos de bytes | Escrever conteúdo conforme as opções; não equivale apenas a mudar o comprimento |
| Ferramenta de rotação de logs | Administrar rotação e retenção de logs | Integrar o procedimento ao comportamento de gravação e reabertura do serviço |
Para alterar horários sem cortar conteúdo, veja touch. Em logs ativos, uma gravação sem modo de acréscimo pode continuar no deslocamento antigo após a redução e deixar uma lacuna; a chamada truncate no Linux não reposiciona o deslocamento aberto. Siga a documentação do serviço e da ferramenta de rotação. Até copytruncate tem uma janela entre copiar e reduzir em que mensagens podem ser perdidas, conforme o manual oficial do logrotate.
Cuidados importantes
Reduzir destrói dados
Trabalhe em uma cópia independente e confirme o caminho real antes de reduzir. Links físicos compartilham o mesmo conteúdo, portanto a mudança por um nome também afeta os demais links. Não confunda backup com outro link físico para o mesmo arquivo. Uma falha não fornece restauração automática nem torna uma operação sobre vários arquivos uma transação.
Estender não repara um formato interno
Aumentar um contêiner não amplia automaticamente partições, índices ou estruturas internas. Um arquivo com bytes zero não se torna um arquivo de banco de dados, imagem de disco ou sistema de arquivos válido. Use as ferramentas apropriadas ao formato e interrompa acessos concorrentes conforme sua documentação. Uma redução feita apenas por truncate pode corromper esse tipo de conteúdo.
Arquivos esparsos podem se expandir durante a cópia
Uma cópia ou transferência pode converter regiões esparsas em blocos efetivamente alocados e aumentar muito o uso de espaço. Confira as opções da cópia com cp, o suporte do destino e o resultado de stat e du. Ao terminar esta prática, volte com cd -- "$truncate_start"; mantenha os arquivos restantes para inspeção e remoção individual.
Perguntas frequentes
O comando truncate -s 0 exclui o arquivo?
Não. Em um arquivo regular existente, o nome permanece e o comprimento passa a zero. Isso não significa preservar todos os atributos: no Linux, uma mudança de tamanho atualiza horários de modificação e de alteração de estado e pode limpar os bits especiais set-user-ID e set-group-ID, conforme a documentação de truncate. Não use essa operação como backup de metadados.
Estender um arquivo aloca todo esse espaço em disco?
Não necessariamente. Uma região ampliada pode ser esparsa. Compare o tamanho lógico de stat ou du --apparent-size com a alocação indicada por stat e du; o resultado depende do sistema de arquivos e não garante espaço reservado para futuras gravações.
Como evito criar um arquivo ausente?
Use -c ou --no-create, junto com o tamanho desejado. No GNU, ignorar um caminho ausente pode resultar em saída zero; consulte a existência e o tamanho depois se o fluxo exigir que o arquivo realmente exista.
O -r copia dados da referência?
Não. -r usa o tamanho da referência. O destino pode ser cortado ou ampliado conforme seu tamanho anterior, preservando apenas os bytes que continuam dentro do novo comprimento; ele não recebe os dados da referência.




