Como limpar o conteúdo de um arquivo da linha de comando?

242

Eu tenho um arquivo de log que contém um monte de coisas que eu não preciso mais. Eu quero limpar o conteúdo.

Eu sei imprimir o conteúdo na tela:

cat file.log

Eu sei como editar o arquivo, linha por linha:

nano file.log

Mas não quero excluir cada linha uma por vez. Existe uma maneira de fazer isso em um comando sem destruir o arquivo para fazer isso?

    
por Andrew 01.01.2010 / 02:50

14 respostas

410

No bash, apenas

> filename

fará.

Isso deixará você com um arquivo vazio filename .

p.s.

Se você precisar de sudo , considere usar truncate como respondido aqui .

    
por 01.01.2010 / 11:20
92

Você pode usar o comando do usuário: truncate

truncate -s 0 test.txt

("- s 0" para especificar o tamanho)

link

    
por 20.08.2013 / 16:21
32

Você pode fazer isso:

echo -n "" > file.log

Usando > para gravar a entrada (nula) de echo -n no arquivo.

Usar >> iria acrescentar a entrada nula ao arquivo (efetivamente não fazendo nada além de touch ing).

    
por 01.01.2010 / 02:55
22
: > file.log

O mesmo que > filename no Bash, mas funciona em mais shells (crédito) . Redireciona a saída do true builtin (que não tem saída) para filename .

    
por 26.07.2014 / 00:51
9

ZSH

>! filename

O ZSH protegerá os usuários contra a invasão de arquivos usando o operador de redirecionamento io > . Se você usar >! , poderá forçar o truncamento de um arquivo existente.

Se você quiser que o ZSH use o comportamento de redirecionamento do Bash, caso não haja proteção contra a invasão de arquivos, será necessário definir a opção clobber para o seu shell.

Mais informações: link

    
por 06.12.2012 / 21:48
7

Se você quiser fazer de dentro de um editor vim na linha de comando, você pode tentar isto:

vim file.txt 

Pressione Esc .

:1,$d

Pressione Enter .

Você encontrará todas as linhas excluídas.

    
por 12.09.2012 / 20:21
4
$ rm file.log; touch file.log

ou

$ cat > file.log

seguido por control-d .

ou ... ou ... ou ...

Ah. Aqui está uma única versão de comando:

$ dd if=/dev/null of=file.log
    
por 01.01.2010 / 02:59
4

Abaixo, o comando também deve funcionar:

cat /dev/null > file.log
    
por 10.05.2016 / 14:45
2

Se você precisar fazer sudo ao privilégio de superusuário para acessar o arquivo, a resposta aceita não funcionará. Usando isso funciona:

truncate -s0 file

ou explicitamente com o sudo:

sudo truncate -s0 file

Mais informações aqui link

    
por 30.01.2015 / 20:11
0

Uma linha de cada vez?

Experimente o vi (m), o adorável editor de texto que pode fazer qualquer coisa. Nesse caso, navegue até uma linha, pressione d (para excluir) e d novamente (para linha).

    
por 01.01.2010 / 04:14
0

Com minhas permissões, esta é a única coisa que funcionou:

touch temp.txt
sudo mv temp.txt original-file.txt
    
por 04.03.2014 / 01:10
0

Poucas alternativas:

ex +%d -scwq file.log
cp /dev/null file.log
vi +%d -escwq file.log
install -m600 /dev/null file.log
    
por 25.10.2015 / 23:27
0

Além disso, se você tiver vários arquivos, poderá usar o seguinte:

for file in /path/to/file/*; do > $file; done

Isso é útil para arquivos de log no mesmo diretório.

    
por 22.06.2016 / 18:35
0

Se você tiver espaços em nomes de arquivos, use:

for file in /path/to/file/*; do > "$file"; done

(Eu não pude incluí-lo nos comentários da resposta anterior porque eu não tenho 50 reputação. Às vezes as limitações são contraproducentes.)

    
por 15.03.2018 / 10:36