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?

Andrew
fonte

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 .

nerd
fonte
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

não não
fonte
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).

Thechickenmoo
fonte
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.

Stuart P. Bentley
fonte
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

Brian Wigginton
fonte
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.

soum
fonte
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
dmckee
fonte
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
4

O comando abaixo também deve funcionar:

cat /dev/null > file.log
paarth batra
fonte
1

Poucas alternativas:

ex +%d -scwq file.log
cp /dev/null file.log
vi +%d -escwq file.log
install -m600 /dev/null file.log
kenorb
fonte
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.)

d491049
fonte
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).

Phoshi
fonte
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
Morgan
fonte
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.

DomíniosFeatured
fonte
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.

user1021769
fonte