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.

Switz
fuente
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'
Sonrisa de nylon
fuente
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

BrDaHa
fuente
@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 ...

Alex Gray
fuente
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
informático
fuente
6
#!/bin/bash

cat <<EOF > SampleFile

Put Some text here 
Put some text here
Put some text here

EOF
Balaji Boggaram Ramanarayan
fuente
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.

greensaxman
fuente
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í

Narendra Maru
fuente
"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).

codificación aaron
fuente
66
Eso podría ser cierto, pero no está relacionado con la pregunta.
Deiwin el