Vaciar el contenido de un archivo.


220

Conozco tres métodos para eliminar todas las entradas de un archivo.

Son

  • >filename
  • touch filename
  • filename < /dev/null

De estos tres abuso >filenamemás, ya que requiere la menor cantidad de pulsaciones de teclas.

Sin embargo, me gustaría saber cuál es el más eficiente de los tres (si hay algún método más eficiente) con respecto a los archivos de registro grandes y los archivos pequeños.

Además, ¿cómo funcionan y eliminan los tres códigos los contenidos?


24
¿Qué hay de truncate -s 0 filename?
— Martin Thoma

Muy similar a la diferencia entre cat y '>' para poner a cero un archivo donde encontrará más información.
— Stéphane Chazelas

El primero solo funcionará si se llama desde la línea de comandos de bash, pero no funcionará si se ejecuta en un archivo .sh
— Marco Marsala

8
touch no elimina contenido, pero cambia el tiempo de acceso al archivo. Lo hace crear un archivo vacío si no existía ninguna.
— hbogert

Respuestas:


293

En realidad, el segundo formulario touch filenameno elimina nada del archivo: solo crea un archivo vacío si no existía o actualiza la fecha de la última modificación de un archivo existente.

Y el tercero filename < /dev/nullintenta ejecutar el nombre del archivo /dev/nullcomo entrada.

cp /dev/null filename trabajos.

En cuanto a eficiente, lo más eficiente sería truncate -s 0 filename; ver aquí: http://linux.die.net/man/1/truncate .

De lo contrario, cp /dev/null filenameo > filenameambos están bien. Ambos abren y luego cierran el archivo, utilizando la configuración de truncar al abrir. cptambién se abre /dev/null, lo que lo hace marginalmente más lento.

Por otro lado, es truncateprobable que sea más lento que > filenamecuando se ejecuta desde un script, ya que ejecutar el comando truncar requiere que el sistema abra el ejecutable, lo cargue y lo ejecute.


99
Entonces, ¿por qué dices que truncatees el más eficiente?
— Stéphane Chazelas

77
La operación truncada usa la llamada al sistema ftruncate () o truncate () que no se molesta en abrir el archivo. También evita la llamada al sistema close () que cp y los > filenamemétodos necesitan llamar.
— ceniza

3
En realidad, (al menos el GNU) hace un abrir + ftruncar + cerrar (además de las muchas llamadas al sistema que hace para cargar e inicializarse), ya que de todos modos, tendría que crear el archivo si no existiera y truncate(2)no hace eso
— Stéphane Chazelas

Si usamos touch filename, ¿permanecerá el inodo igual (siempre que haya un archivo antes)?
— pMan

1
@pMan sí, puedes probarlo y consultar conls -i
— terdon

43

Otra opción podría ser:

echo -n > filename

Desde la página del manual de echo:

-n Do not print the trailing newline character.


¿Cómo puedo configurar el tamaño? ¿Digo si quiero 30000 caracteres nulos?
— Usuario

3

Hay un comando incorporado ":", que está disponible en sh, csh, bash y otros quizás, que puede usarse fácilmente con el operador de salida de redireccionamiento >truncar un archivo:

#!/usr/bin/env bash
:> filename

Lo que me gusta de esto es que no necesita ningún comando externo como "echo", etc.

Una gran ventaja de truncar archivos en lugar de eliminarlos / recrearlos es que ejecutar aplicaciones que funcionan con este archivo (por ejemplo, alguien crea tail -f filenameun software de monitoreo o ...) no tiene que volver a abrirlo. Simplemente pueden continuar usando el descriptor de archivo y obtener todos los datos nuevos.


man bashdescribe que la :concha incorporada no tiene ningún efecto.
— Haxiel

Sí, y redirige esto >al archivo, que crea el archivo si no existe, y si existe, lo trunca a cero. Mejor dicho: usa el :para no hacer nada, y usa >para redirigir nada a un archivo y truncarlo.
— Mirko Steiner

1
¿Por qué harías eso? > filees suficiente para truncar un archivo. No necesita ningún comando, solo el operador de redirección.
— terdon

1
A veces, > filenameno funciona. por ejemplo, en zsh. Pero : > filenamefunciona aún.
— CS Pei

A Bash y sh parece gustarle, > myfilepero p. Ej. Errores csh con: Comando nulo inválido.
— Mirko Steiner
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.