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?
linux
command-line
Andrew
fonte
fonte
bash
como shell e não como, por exemplocmd.exe
, o PowerShell, nenhum dos quais POSIXy o suficiente para lidar com essas coisas.Você pode usar o comando do usuário: truncar
("-s 0" para especificar o tamanho)
http://www.commandlinefu.com/commands/view/12/empty-a-file
fonte
sudo echo > file
apenas fornece um erro nesses casos.sudo bash -c '> filename'
é como você usa as soluções Bash com o sudo.brew install truncate
no os x com o homebrew instalado.Você pode fazer isso:
Utilizando
>
para gravar a entrada (nula) deecho -n
no arquivo.Usando
>>
seria anexar a entrada nula para o arquivo (efetivamente fazendo nada, mastouch
ing-lo).fonte
true
(ou seu alias interno:
), embora, no final das contas, você não precise de um comando (veja a resposta aceita).sudo
.O mesmo que
> filename
no Bash, mas funciona com mais conchas (crédito) . Redireciona a saída dotrue
built-in (que não possui saída) parafilename
.fonte
:> filename
. Não parece um smiley? :>ZSH
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
clobber
opção para o seu shell.Mais informações: http://zsh.sourceforge.net/Doc/Release/Redirection.html
fonte
Se você deseja fazer de dentro de um editor vim na linha de comando, você pode tentar o seguinte:
Pressione Esc.
Pressione Enter.
Você encontrará todas as linhas excluídas.
fonte
maillog
, mesmosudo > /var/log/maillog
não limpá-la (permissão negada)sudo > /var/log/maillog
meio - 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 su
iniciar o shell raiz e depois executar> /var/log/maillog
.ou
seguido por
control-d
.ou ... ou ... ou ...
Ah Aqui está uma versão de comando único:
fonte
echo "" > file.log
é melhor do que acat
opção que você mostra, nessa situação, mas há outras ondecat
é mais apropriado. ambos usam o mesmo redirecionamento de shell para fazer o trabalho pesado.rm
realizará a tarefa de produzir um arquivo vazio com o mesmo nome. Mas isso não será adequado para todos os casos de uso.O comando abaixo também deve funcionar:
fonte
Se você precisar do privilégio sudo to superuser para acessar o arquivo, a resposta aceita não funcionará. Usar isso funciona:
ou explicitamente com sudo:
Mais informações aqui http://www.commandlinefu.com/commands/view/12/empty-a-file
fonte
Poucas alternativas:
fonte
Se você tiver espaços nos nomes de arquivos, use:
(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.)
fonte
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).
fonte
gg
move para o topo, para que toda a sequência possa serggdG
.Com minhas permissões, esta é a única coisa que funcionou:
fonte
Além disso, se você tiver vários arquivos, poderá usar o seguinte:
Isso é útil para arquivos de log no mesmo diretório.
fonte
> 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.
fonte