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


280

Eu tenho um arquivo de log que contém várias coisas das quais não preciso mais. Eu quero limpar o conteúdo.

Eu sei como 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 de cada vez. Existe uma maneira de fazer isso em um comando sem destruir o arquivo?

Respostas:


466

No bash, apenas

> filename

vai fazer.

Isso deixará você com um nome de arquivo vazio .

ps

Se você precisar sudoligar, considere usar truncatecomo respondido aqui .


57
Este é provavelmente o comando raddest na história da computação
blarg

7
Pelo contrário, @ Arekkusandaa.Irujasukin; Ele funciona bem em qualquer versão do Windows, desde que, como mencionado, você esteja usando bashcomo shell e não como, por exemplo cmd.exe, o PowerShell, nenhum dos quais POSIXy o suficiente para lidar com essas coisas.
DopeGhoti

124

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

truncate -s 0 test.txt

("-s 0" para especificar o tamanho)

http://www.commandlinefu.com/commands/view/12/empty-a-file


3
A melhor resposta é que funciona quando você não é root (com sudo) - sudo echo > fileapenas fornece um erro nesses casos.
Dmitry Verkhoturov 19/08/2015

12
@DmitryVerkhoturov: sudo bash -c '> filename'é como você usa as soluções Bash com o sudo.
Stuart P. Bentley

1
brew install truncateno os x com o homebrew instalado.
Xaxxon

Funciona mais rápido que o eco
Miao1007 26/11

34

Você pode fazer isso:

echo -n "" > file.log

Utilizando >para gravar a entrada (nula) de echo -nno arquivo.

Usando >>seria anexar a entrada nula para o arquivo (efetivamente fazendo nada, mas touching-lo).


Isso deixará um espaço lá.
dmckee

Estou recebendo este: -bash:: command not found
Andrew

3
echo ""> ainda fornecerá um arquivo com um caractere (uma nova linha.) Se você quiser usar echo, use "echo -n> file.log" para ecoar nulo.
Dave Forgac

Seria melhor usar um comando de saída nula dedicado como true(ou seu alias interno :), embora, no final das contas, você não precise de um comando (veja a resposta aceita).
Stuart P. Bentley

Você pode ter alguns problemas com sudo.
flapjack

27
: > file.log

O mesmo que > filenameno Bash, mas funciona com mais conchas (crédito) . Redireciona a saída do truebuilt-in (que não possui saída) para filename.


Eu vim para fazer esta resposta, mas infelizmente já está aqui ... Faça um voto positivo.
Aaron Hall

5
Apenas faça :> filename. Não parece um smiley? :>
minmaxavg

10

ZSH

>! filename

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

Se você deseja que o ZSH use o comportamento de redirecionamento do Bash, se não houver proteção contra descargas de arquivos, será necessário definir a clobberopção para o seu shell.

Mais informações: http://zsh.sourceforge.net/Doc/Release/Redirection.html


8

Se você deseja fazer de dentro de um editor vim na linha de comando, você pode tentar o seguinte:

vim file.txt 

Pressione Esc.

:1,$d

Pressione Enter.

Você encontrará todas as linhas excluídas.


Esta é a única coisa que funcionou para o meu maillog, mesmo sudo > /var/log/maillognão limpá-la (permissão negada)
bobobobo

2
@obobobo Não funciona como um sudo > /var/log/maillogmeio - execute o sudo e coloque sua saída no arquivo. Obviamente, ele coloca a saída com as permissões de usuário atuais. O mais fácil é sudo suiniciar o shell raiz e depois executar > /var/log/maillog.
kan

4
$ rm file.log; touch file.log

ou

$ cat > file.log

seguido por control-d.

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

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

$ dd if=/dev/null of=file.log

2
A sugestão de Thechickenmoo echo "" > file.logé melhor do que a catopção que você mostra, nessa situação, mas há outras onde caté mais apropriado. ambos usam o mesmo redirecionamento de shell para fazer o trabalho pesado.
quack quixote

2
Você não precisa executar o comando cat. Apenas "> file.log" fará isso.
Camh

A remoção do arquivo redefinirá a data de criação.
Matteo

A remoção do arquivo fará com que os programas que assistem esse arquivo percam o ponteiro para ele (ou seja, ele terá um novo endereço no sistema de arquivos). De um modo geral, yes rmrealizará a tarefa de produzir um arquivo vazio com o mesmo nome. Mas isso não será adequado para todos os casos de uso.
RobertDez



1

Poucas alternativas:

ex +%d -scwq file.log
cp /dev/null file.log
vi +%d -escwq file.log
install -m600 /dev/null file.log

1

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

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

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


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) ed novamente (para linha).


5
Se você quiser se livrar de todo o arquivo no vim, com o cursor na parte superior do documento, digitar d G (que é d, então shift-G) excluirá o arquivo inteiro (d para excluir, G para o final do Arquivo). No entanto, prefiro o seu método (isso me dá mais tempo para pensar se eu REALMENTE quero ou não lixeira o arquivo).
Babu

O @Babu se ggmove para o topo, para que toda a sequência possa ser ggdG.
Bob

0

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

touch temp.txt
sudo mv temp.txt original-file.txt

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.


0

> a.txt

O mesmo que> nome do arquivo no Bash, mas funciona com mais shells (crédito). Redireciona a saída do verdadeiro built-in (que não possui saída) para o nome do arquivo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.