Escribir en el archivo, pero sobrescribirlo si existe


252
echo "text" >> 'Users/Name/Desktop/TheAccount.txt'

¿Cómo lo hago para que cree el archivo si no existe, pero lo sobrescribe si ya existe? En este momento este script solo se agrega.


bueno ... esto es asombroso. Reconocí> un poco antes que >>.
Bromista del

Respuestas:


411

Un poco de comprensión de cómo funcionan las tuberías * nix ayudaría.

En resumen, el >>operador de redireccionamiento agregará líneas al final del archivo especificado, donde-como el único mayor que >vaciará y sobrescribirá el archivo.

echo "text" > 'Users/Name/Desktop/TheAccount.txt'

99
Algunos entornos no permiten algo como -bash: TheAccount.txt: cannot overwrite existing file.
Tom Russell

16
Además, >y >>son los operadores de redirección de salida . El operador de la tubería es |.
Tom Russell

22
Ver la respuesta de @BrDaHa. Usar >|para forzar la sobrescritura existente
Jake

2
esta no es la respuesta correcta porque no sobrescribirá el archivo existente
iWizard

44
La respuesta debe actualizarse con la respuesta de @ Jake de estos comentarios, la respuesta aceptada es incorrecta de varias maneras
rm.rf.etc

90

En Bash, si ha configurado noclobber a la set -o noclobber, entonces usa la sintaxis>|

Por ejemplo:

echo "some text" >| existing_file

Esto también funciona si el archivo aún no existe


  • Compruebe si noclobber está configurado con: set -o | grep noclobber

  • Para obtener una explicación más detallada sobre este tipo especial de operador, consulte esta publicación

  • Para obtener una lista más exhaustiva de operadores de redirección, consulte esta publicación


@stimulate ¿estás usando bash shell?
BrDaHa

@BrDaHa ¿Cómo puedo redirigir stderr con> | ¿también? Lo intenté y> | Pero no funcionó.
Tu Bui

@TuBui no está seguro de por qué no funciona para usted. En mi máquina &>| filefunciona. ¿Qué shell y versión estás usando? @stimulate para zsh ambos deberían funcionar , para bash es solo>|
Griddo

@Griddo mi shell es bash versión 4.3.48 (1) -lanzamiento. echo "aaa" &>| test.txtda como resultado un error -bash: syntax error near unexpected token |. Mi noclobber está activado.
Tu Bui

1
@TuBui Aparentemente no estaba probando correctamente. Tampoco funciona para mí ... sin embargo, la documentación no establece que debería ser posible de todos modos. Probablemente tenga que apegarse echo "aaa" >| test.txt 2>&1o usar otro caparazón.
Griddo

40

A pesar NylonSmilede la respuesta , que es "más o menos" correcta ... No pude sobrescribir archivos de esta manera ...

echo "i know about Pipes, girlfriend" > thatAnswer

zsh: file exists: thatAnswer

para resolver mis problemas ... tuve que usar ... >!, a la ...

[[ $FORCE_IT == 'YES' ]] && echo "$@" >! "$X" || echo "$@" > "$X"

Obviamente, ten cuidado con esto ...


26
Esto significa que tiene NOCLOBBERestablecida la opción zsh no predeterminada . Use setopt clobber para restaurar el comportamiento predeterminado.
Michał Politowski

11

Si su entorno no permite sobrescribir con >, use pipe |y en su teelugar de la siguiente manera:

echo "text" | tee 'Users/Name/Desktop/TheAccount.txt'

Tenga en cuenta que esto también se imprimirá en la salida estándar. En caso de que esto no sea deseado, puede redirigir la salida de la /dev/nullsiguiente manera:

echo "text" | tee 'Users/Name/Desktop/TheAccount.txt' > /dev/null


2

Solo observando que si desea redirigir std :: cerr y std :: cout a un archivo mientras no tiene configurado el ciclobber (es decir set -o noclobber), puede usar el código:

    cmd >|file.txt 2>&1

Se puede ver más información sobre esto en https://stackoverflow.com/a/876242 .

También esta respuesta es la pregunta de @ TuBui sobre la respuesta @BrDaHa proporcionada anteriormente el 9 de agosto de 18 a las 9:34.


0

Para sobrescribir el contenido de un archivo a otro archivo. utilizar gato por ejemplo.

echo  "this is foo" > foobar.txt
cat foobar.txt

echo "this is bar" > bar.txt
cat bar.txt

Ahora para sobrescribir foobar podemos usar un comando cat como se muestra a continuación

cat bar.txt >> foobar.txt
cat foobar.txt

ingrese la descripción de la imagen aquí


"Ahora para sobrescribir foobar ..." - >>se agrega, no se sobrescribe
Drenai

-2

Si tiene una salida que puede tener errores, es posible que desee utilizar un ampersand y un mayor que, de la siguiente manera:

my_task &> 'Users/Name/Desktop/task_output.log' esto redirigirá tanto stderr como stdout al archivo de registro (en lugar de solo stdout).


66
Eso podría ser cierto, pero no está relacionado con la pregunta.
Deiwin el
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.