Estou ciente de três métodos para excluir todas as entradas de um arquivo.
Eles são
>filename
touch filename
filename < /dev/null
Desses três, eu abusei >filename
mais, pois isso requer o menor número de pressionamentos de tecla.
No entanto, gostaria de saber qual é o mais eficiente dos três (se houver algum método mais eficiente) em relação a arquivos de log grandes e pequenos.
Além disso, como os três códigos operam e excluem o conteúdo?
shell-script
files
debal
fonte
fonte
truncate -s 0 filename
?Respostas:
Na verdade, o segundo formulário
touch filename
não exclui nada do arquivo - ele cria apenas um arquivo vazio se não existir, ou atualiza a data da última modificação de um arquivo existente.E o terceiro
filename < /dev/null
tenta executar o nome do arquivo/dev/null
como entrada.cp /dev/null filename
trabalho.Quanto a eficiente, o mais eficiente seria
truncate -s 0 filename
; veja aqui: http://linux.die.net/man/1/truncate .Caso contrário,
cp /dev/null filename
ou> filename
ambos estão bem. Os dois abrem e fecham o arquivo, usando a configuração truncar ao abrir.cp
também abre/dev/null
, o que o torna marginalmente mais lento.Por outro lado,
truncate
provavelmente seria mais lento do que> filename
quando executado a partir de um script, pois a execução do comando truncate exige que o sistema abra o executável, carregue-o e execute-o.fonte
truncate
é o mais eficiente?> filename
métodos precisam chamar.truncate(2)
não faz isso.touch filename
, o inode permanecerá o mesmo (desde que haja um arquivo antes)?ls -i
Outra opção pode ser:
Na página do manual de
echo
:fonte
Existe um comando interno ":", disponível em sh, csh, bash e outros talvez, que pode ser facilmente usado com o operador de saída de redirecionamento que
>
trunca um arquivo:O que eu gosto nisso é que ele não precisa de nenhum comando externo como "eco" etc.
Uma grande vantagem de truncar arquivos em vez de excluí-los / recriá-los é que os aplicativos em execução que funcionam com esse arquivo (por exemplo, alguém cria um
tail -f filename
ou um software de monitoramento, ...) não precisam reabri-lo. Eles simplesmente podem continuar usando o filedescriptor e obter todos os novos dados.fonte
man bash
descreve o:
shell embutido como sem efeito.>
para dentro do arquivo, que cria o arquivo se ele não existir e, se existir, você o trunca para zero. Melhor dito: você usa o:
para não fazer nada, e>
para redirecionar nada para um arquivo e truncá-lo.> file
é suficiente para truncar um arquivo. Você não precisa de nenhum comando, apenas o operador de redirecionamento.> filename
não vai funcionar. por exemplo, no zsh. mas: > filename
funciona ainda.> myfile
mas por exemplo, erros csh com: Comando nulo inválido.