¿Cómo borrar el contenido de un archivo desde la línea de comando?


280

Tengo un archivo de registro que contiene un montón de cosas que ya no necesito. Quiero borrar el contenido.

Sé cómo imprimir los contenidos en la pantalla:

cat file.log

Sé cómo editar el archivo, línea por línea:

nano file.log

Pero no quiero eliminar cada línea de una en una. ¿Hay alguna manera de hacerlo en un comando sin destruir el archivo para hacerlo?

Respuestas:


466

En bash, solo

> filename

lo haré

Esto te dejará con un nombre de archivo vacío .

PD

Si necesita una sudollamada, considere usarla truncatecomo se responde aquí .


57
Este es probablemente el comando más
radical

77
Por el contrario, @ Arekkusandaa.Irujasukin; funciona bien en cualquier versión de Windows, siempre y cuando, como se mencionó, esté utilizando bashcomo su shell y no, por ejemplo, cmd.exeo PowerShell, ninguno de los cuales es lo suficientemente POSIXy como para esperar que maneje tales cosas.
DopeGhoti

124

Puede usar el comando de usuario: truncar

truncate -s 0 test.txt

("-s 0" para especificar el tamaño)

http://www.commandlinefu.com/commands/view/12/empty-a-file


3
La mejor respuesta, funciona cuando no eres root (con sudo), sudo echo > filesolo da un error en tales casos.
Dmitry Verkhoturov

12
@DmitryVerkhoturov: así sudo bash -c '> filename'es como usas las soluciones Bash con sudo.
Stuart P. Bentley

1
brew install truncateen os x con homebrew instalado.
xaxxon

Funciona más rápido que el eco
Miao1007

34

Podrías hacer esto:

echo -n "" > file.log

Utilizando >para escribir la entrada (nula) echo -ndel archivo.

El uso agregaría la entrada nula al archivo (efectivamente, no >>haría nada más que introducirlo ).touch


Esto dejará un espacio allí.
dmckee

Estoy obteniendo esto: -bash:: comando no encontrado
Andrew

3
echo ""> todavía le dará un archivo con un carácter (una nueva línea). Si desea usar echo, use "echo -n> file.log" para echo nulo.
Dave Forgac

Sería mejor usar un comando dedicado de salida nula como true(o su alias incorporado :), aunque en última instancia no necesita ningún comando (consulte la respuesta aceptada).
Stuart P. Bentley

Es posible que tenga algunos problemas con sudo.
flapjack

27
: > file.log

Igual que > filenameen Bash, pero funciona en más shells (crédito) . Redirige la salida desde el trueincorporado (que no tiene salida) a filename.


Vine a hacer esta respuesta, pero por desgracia ya está aquí ... Haga una votación positiva.
Aaron Hall

55
Solo hazlo :> filename. ¿No parece un smiley? :>
minmaxavg

10

ZSH

>! filename

ZSH protegerá a los usuarios de archivos de clobbering utilizando el operador de redireccionamiento io >. Si lo usa >!, puede forzar el truncamiento de un archivo existente.

Si desea que ZSH use el comportamiento de redireccionamiento de Bash, si no hay protección contra el golpeteo de archivos, debe configurar la clobberopción para su shell.

Más información: http://zsh.sourceforge.net/Doc/Release/Redirection.html


8

Si desea hacerlo desde un editor vim en la línea de comandos, puede intentar esto:

vim file.txt 

Presione Esc.

:1,$d

Presione Enter.

Encontrará todas las líneas eliminadas.


Esto es lo único que funcionó para mi maillog, incluso sudo > /var/log/maillogno lo despejaría (permiso denegado)
bobobobo

2
@bobobobo No funciona como un sudo > /var/log/maillogmedio: ejecuta sudo y coloca su salida en el archivo. Obviamente, pone salida con permisos de usuario actuales. Lo más fácil es sudo suiniciar root shell y luego hacerlo > /var/log/maillog.
kan

4
$ rm file.log; touch file.log

o

$ cat > file.log

seguido de control-d.

o ... o ... o ...

Ah Aquí hay una versión de comando único:

$ dd if=/dev/null of=file.log

2
La sugerencia de Thechickenmoo echo "" > file.loges mejor que la catopción que muestra, en esta situación, aunque hay otros donde cates más apropiado. ambos usan la misma redirección de shell para hacer el trabajo pesado.
quack quijote

2
No necesita ejecutar el comando cat. Solo "> file.log" lo hará.
camh

Eliminar el archivo restablecerá la fecha de creación.
Matteo

Al eliminar el archivo, los programas que lo vean perderán su puntero (es decir, tendrá una nueva dirección en el sistema de archivos). En términos generales, sí rmlogrará la tarea de producir un archivo vacío con el mismo nombre. Pero no va a ser adecuado para todos los casos de uso.
robert

4

El siguiente comando también debería funcionar:

cat /dev/null > file.log


1

Pocas alternativas:

ex +%d -scwq file.log
cp /dev/null file.log
vi +%d -escwq file.log
install -m600 /dev/null file.log

1

Si tiene espacios en los nombres de archivo, use:

for file in /path/to/file/*; do > "$file"; done

(No pude incluirlo en los comentarios a la respuesta anterior porque no tengo 50 reputación. A veces las limitaciones son contraproducentes).


0

¿Una línea a la vez?

Pruebe vi (m), el encantador editor de texto que puede hacer cualquier cosa. En este caso, navegue hasta una línea, presione d (para eliminar) y d nuevamente (para la línea).


55
Si desea deshacerse de todo el archivo en vim, con el cursor en la parte superior del documento, escribiendo d G (eso es d, luego shift-G) eliminará todo el archivo (d para eliminar, G para el final del archivo). Sin embargo, prefiero su método (me da más tiempo para pensar si REALMENTE quiero o no desechar el archivo).
Babu

@Babu se ggmueve a la parte superior para que pueda ser toda la secuencia ggdG.
Bob

0

Con mis permisos, esto es lo único que funcionó:

touch temp.txt
sudo mv temp.txt original-file.txt

0

Además, si tiene varios archivos, puede usar lo siguiente:

for file in /path/to/file/*; do > $file; done

Esto es útil para los archivos de registro en el mismo directorio.


0

> a.txt

Igual que> filename en Bash, pero funciona en más shells (crédito). Redirige la salida del verdadero archivo incorporado (que no tiene salida) al nombre de archivo.

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.