2010-03-11 12 views
100

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 funciona (obviamente). Pero cuando intento el siguiente¿Cómo vaciar ("truncar") un archivo en Linux que ya existe y está protegido de alguna manera?

cat /dev/null > error.log 

consigo el mensaje

File already exists. 

Obviamente hay algún tipo de configuración realizado en el servidor para evitar primordial accidental de archivos. ¿Alguien puede decir cómo puedo "truncar" el archivo en un solo comando?

+2

Para un archivo truncados no protegida -s 0 trabajos de archivo. – Pramod

Respuesta

147

Usted tiene definido el noclobber opción. ve el error como si fuera de la CSH, por lo que haría:

cat /dev/null >! file 

Si estoy equivocado y se está utilizando bash, que debe hacer:

cat /dev/null >| file 

en bash, también se puede acortar ese a:

>| file 
+0

tiene razón acerca de que el shell es csh. Cómo lo supiste? –

+5

@Wikidkaka: según el mensaje de error. csh en mi sistema da el mismo error 'File exists' mientras que bash da el muy diferente error 'can not overwrite existing file'. –

+6

@Jarmund - porque el usuario tiene establecido noclobber, '> file' no funciona. –

4

falsa | camiseta fileToTruncate

funcione tan bien

+0

. Eso es una tontería. O si esto es útil, oscuramente obtener 'dd' para producir nada sería incluso mejor que el' falso' legible. – tripleee

47

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

> error.log 
+6

'sudo sh -c '> error.log'' –

+4

en realidad, este ** 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 "); ver el comentario arriba ("@Jarmund - porque el usuario tiene un juego de noclobber,> el archivo no funciona"). Solo me pregunto qué tipo de "personas inteligentes" votaron a favor, obviamente respuestas erróneas como esta ... – vaxquis

-3

Usted puede tratar también:

echo -n > /my/file

+8

¿Ves la respuesta con un montón de votos? Intenta leerlo, busca 'noclobber' y luego pregúntate si tu respuesta tiene algún sentido. –

63

También puede utilizar la función truncado

$truncate -s0 yourfile 

si ha denegado el permiso, el uso de sudo

$sudo truncate -s0 yourfile 

Ayuda/Manual: hombre truncar

probado en Ubuntu Linux

+1

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

2

Desde sudo no funcionará con redirection>, me gusta el comando tee de este propósito

echo "" | sudo tee fileName 
+0

bueno, de hecho lo hace, como se describe tanto en la pregunta que ha vinculado como en la anterior. "sudo sh -c '> error.log'" ... – vaxquis

+0

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

+0

Esto no truncará realmente el archivo, porque' echo "" 'agregará una nueva línea. Puede usar 'echo -n" "' para suprimir la nueva línea – Seb

6

el mérito es de mi colega mayor para esto:

:> filename 

Esto no rompa los archivos de registro, por lo que incluso se puede utilizar en syslog, por ejemplo.

+8

Por favor explique. ¿Como funciona? ¿Qué está haciendo esa notación? – user31986

+2

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

Cuestiones relacionadas