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

Andrés
fuente

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í .

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

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

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

Stuart P. Bentley
fuente
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

Brian Wigginton
fuente
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.

soum
fuente
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
dmckee
fuente
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
paarth batra
fuente
1

Pocas alternativas:

ex +%d -scwq file.log
cp /dev/null file.log
vi +%d -escwq file.log
install -m600 /dev/null file.log
kenorb
fuente
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).

d491049
fuente
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).

Phoshi
fuente
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
Morgan
fuente
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.

Dominios Destacados
fuente
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.

usuario1021769
fuente