Scrivi su un file, ma sovrascriverlo se esiste


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

Come lo faccio in modo che crei il file se non esiste, ma lo sovrascrive se esiste già. In questo momento questo script si aggiunge.


bene..questo è fantastico. Ho riconosciuto> un po 'prima di >>.
Jokester,

Risposte:


411

Una piccola comprensione di come funzionano i tubi * nix sarebbe di aiuto.

In breve, l' >>operatore di reindirizzamento aggiungerà le righe alla fine del file specificato, dove -come il singolo maggiore di >svuota e sovrascrive il file.

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

9
Alcuni ambienti non consentono qualcosa di simile -bash: TheAccount.txt: cannot overwrite existing file.
Tom Russell,

16
Inoltre, >e >>sono gli operatori di reindirizzamento dell'output . L'operatore del tubo è |.
Tom Russell,

22
Vedi la risposta di @BrDaHa. Usa >|per forzare la sovrascrittura esistente
Jake

2
questa non è affatto una risposta corretta perché non sovrascriverà il file esistente
iWizard,

4
La risposta dovrebbe essere aggiornata con la risposta di @ Jake da questi commenti, la risposta accettata è sbagliata in molti modi
rm.rf.etc

90

In Bash, se hai impostato noclobber a la set -o noclobber, allora usi la sintassi>|

Per esempio:

echo "some text" >| existing_file

Questo funziona anche se il file non esiste ancora


  • Controlla se noclobber è impostato con: set -o | grep noclobber

  • Per una spiegazione più dettagliata su questo tipo speciale di operatore, vedi questo post

  • Per un elenco più completo di operatori di reindirizzamento, fare riferimento a questo post


@stimulate stai usando la shell bash?
BrDaHa,

@BrDaHa Come posso reindirizzare anche stderr con> | anche? Ho provato &> | ma non ha funzionato.
Tu Bui,

@TuBui non so perché non funziona per te. Sulla mia macchina &>| filefunziona. Quale shell e versione stai usando? @stimulate for zsh dovrebbero funzionare entrambi , per bash è solo>|
Griddo,

@Griddo my shell is bash versione 4.3.48 (1) -release. echo "aaa" &>| test.txtrisulta in errore -bash: syntax error near unexpected token |. Il mio noclobber è acceso.
Tu Bui,

1
@TuBui Apparentemente non stavo testando correttamente. Neanche per me funziona ... tuttavia la documentazione non afferma che dovrebbe essere possibile comunque. Probabilmente devi attenersi echo "aaa" >| test.txt 2>&1o usare un'altra shell.
Griddo,

40

Nonostante NylonSmilela risposta , che è "una specie di" corretta .. Non sono stato in grado di sovrascrivere i file, in questo modo ..

echo "i know about Pipes, girlfriend" > thatAnswer

zsh: file exists: thatAnswer

per risolvere i miei problemi .. Ho dovuto usare ... >!, á la ..

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

Ovviamente, stai attento con questo ...


26
Ciò significa che hai NOCLOBBERimpostato l' opzione zsh non predefinita . Utilizzare setopt clobber per ripristinare il comportamento predefinito.
Michał Politowski,

11

Se il tuo ambiente non consente la sovrascrittura con >, usa pipe |e teeinvece come segue:

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

Nota che questo verrà anche stampato sullo stdout. Nel caso in cui ciò sia indesiderato, è possibile reindirizzare l'output /dev/nullcome segue:

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


2

Solo notando che se si desidera reindirizzare sia std :: cerr che std :: cout su un file mentre è impostato noclobber (cioè set -o noclobber), è possibile utilizzare il codice:

    cmd >|file.txt 2>&1

Ulteriori informazioni al riguardo sono disponibili su https://stackoverflow.com/a/876242 .

Anche la domanda di @ TuBui di questa risposta sulla risposta @BrDaHa fornita sopra al 9 agosto 18 alle 9:34.


0

Per sovrascrivere il contenuto di un file in un altro file. utilizzare gatto ad es.

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

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

Ora per sovrascrivere foobar possiamo usare un comando cat come di seguito

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

inserisci qui la descrizione dell'immagine


"Ora per sovrascrivere foobar ..." - >>è accodare, non sovrascrivere
Drenai

-2

Se hai un output che può avere errori, potresti voler usare una e commerciale e una maggiore di, come segue:

my_task &> 'Users/Name/Desktop/task_output.log' questo reindirizzerà sia stderr che stdout al file di registro (anziché solo stdout).


6
Questo potrebbe essere vero, ma non è correlato alla domanda.
Deiwin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.