¿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?

Sumeet Pareek
fuente
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
R Samuel Klatchko
fuente
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

risnandar
fuente
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
SIFE
fuente
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.

petermolnar
fuente
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

Dodger Web
fuente
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
sakhunzai
fuente
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
user3301460
fuente
0

Me gusta esto: cp /dev/null file

Den129
fuente
-4

También puedes probar:

echo -n > /my/file

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