¿Cómo vaciar ("truncar") un archivo en Linux que ya existe y está protegido de alguna manera?


113

Tengo un archivo llamado error.log en mi servidor que necesito truncar con frecuencia. Tengo permisos rw para el archivo. Abrir el archivo en vi> eliminar todo el contenido> guardar trabajos (obviamente). Pero cuando pruebo lo de abajo

cat /dev/null > error.log

entiendo el mensaje

File already exists.

Obviamente, existe algún tipo de configuración en el servidor para evitar la anulación accidental de archivos. ¿Alguien puede decir cómo "trunco" el archivo en un solo comando?


2
Para un archivo no protegido, truncate -s 0 file funciona.
Pramod

Respuestas:


158

Tienes la noclobberopción configurada. El error parece ser de csh, por lo que debería hacer:

cat /dev/null >! file

Si me equivoco y estás usando bash, debes hacer:

cat /dev/null >| file

en bash, también puede acortarlo a:

>| file

tienes razón acerca de que el shell es csh. Cómo lo supiste?
Sumeet Pareek

6
@Wikidkaka - basado en el mensaje de error. csh en mi sistema da un File existserror similar mientras que bash da un cannot overwrite existing fileerror muy diferente .
R Samuel Klatchko

6
@Jarmund: porque el usuario no tiene configurado ningún reloj, >fileno funciona.
R Samuel Klatchko

¿Cuál es la diferencia entre > filey >| file?
Will el

1
@Will: si tiene la noclobberopción configurada, el intento de redirigir a un archivo existente falla. Para anular la redirección específica sin dejar el noclobber activado, puede usar>|
R Samuel Klatchko

71

También puede utilizar la función truncar

$truncate -s0 yourfile

si se le niega el permiso, use sudo

$sudo truncate -s0 yourfile

Ayuda / Manual: man truncate

probado en ubuntu Linux


1
truncar también toca la hora de modificación del archivo, mientras que "> archivo" no toca si el archivo no se modifica.
dsteinkopf

No libera el espacio en disco que contiene el archivo. Al principio muestra los 0 bytes. Pero cuando escribe algo en ese archivo, el tamaño del archivo es = antes de truncar + nuevo tamaño de datos.
Aniket Kulkarni

48

Esto será suficiente para establecer el tamaño del archivo en 0:

> error.log

6
en realidad, esto no funciona con noclobber (lo probé yo mismo), por lo que NO es una solución válida en este caso ("-bash: error.log: no se puede sobrescribir el archivo existente"); consulte el elogio anterior ("@Jarmund - porque el usuario no tiene configurado ningún reloj,> el archivo no funciona"). Me pregunto qué tipo de "gente inteligente"

9

el mérito es de mi colega principal por esto:

:> filename

Esto no romperá los archivos de registro, por lo que incluso puede usarlo en syslog, por ejemplo.


8
Por favor explique. ¿Como funciona? ¿Qué hace esa notación?
user31986

2
@ user31986 :es un comando sin efecto (casi un comentario), luego >es la redirección como de costumbre, por lo que esto solo redirige la falta de salida de un comando que no hace nada en el archivo. Si noclobber está habilitado, necesita :>| filename(bash) (y supongo que :>! filenameen csh asumiendo que csh tiene :).
Rhubbarb

4

falso | tee fileToTruncate

puede funcionar también


Eso es una tontería. ¿O si esto es útil, obtener de forma oscura la ddsalida de nada sería incluso mejor que la simple lectura false?
tripleee

2

Dado que sudo no funcionará con la redirección > , me gusta el teecomando para este propósito

echo "" | sudo tee fileName

bueno, en realidad lo hace, como se describe tanto en la pregunta que vinculó como aquí arriba. "sudo sh -c '> error.log'" ...

depende de los permisos en el archivo de destino error.log, si ya se puede escribir, no es necesario sudo. Creo que el otro problema es que está pasando el comando como argumento de cadena sh, no sé cómo se maneja internamente, pero esa es otra capa de complejidad / redirección agregada
sakhunzai

1
En realidad, esto no truncará el archivo, porque echo ""agregará una nueva línea. Puede utilizar echo -n ""para suprimir la nueva línea
Seb

0

Cualquiera puede probar este comando para truncar cualquier archivo en el sistema Linux

Esto seguramente funcionará en cualquier formato:

truncate -s 0 file.txt


-4

También puedes probar:

echo -n > /my/file


8
¿Ves la respuesta con un montón de votos? Intente leerlo, mire hacia arriba noclobbery luego pregúntese si su respuesta tiene algún sentido.
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.