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?

debatir
fuente
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.

ceniza
fuente
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.

Arturo Herrero
fuente
¿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.

Mirko Steiner
fuente
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