In eine Datei schreiben, aber überschreiben, falls vorhanden


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

Wie mache ich es so, dass es die Datei erstellt, wenn sie nicht existiert, aber überschreibt, wenn sie bereits existiert. Im Moment wird dieses Skript nur angehängt.


Nun ... das ist großartig. Ich habe> etwas früher als >> bestätigt.
Jokester

Antworten:


411

Ein wenig Verständnis der Funktionsweise von * nix-Rohren würde helfen.

Kurz gesagt, der >>Umleitungsoperator hängt Zeilen an das Ende der angegebenen Datei an, wobei >die Datei größer als ist und die Datei leer und überschreibt.

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

9
Einige Umgebungen verbieten so etwas wie -bash: TheAccount.txt: cannot overwrite existing file.
Tom Russell

16
Auch >und >>sind die Ausgabeumleitungsoperatoren . Der Rohrbetreiber ist |.
Tom Russell

22
Siehe Antwort von @BrDaHa. Verwenden Sie >|, um das Überschreiben zu erzwingen
Jake

2
Dies ist überhaupt keine richtige Antwort, da die vorhandene Datei nicht überschrieben wird
iWizard

4
Die Antwort sollte mit @ Jakes Antwort aus diesen Kommentaren aktualisiert werden. Die akzeptierte Antwort ist in mehrfacher Hinsicht falsch
rm.rf.etc

90

Wenn Sie in Bash noclobber a la festgelegt haben set -o noclobber, verwenden Sie die Syntax>|

Beispielsweise:

echo "some text" >| existing_file

Dies funktioniert auch, wenn die Datei noch nicht vorhanden ist


  • Überprüfen Sie, ob noclobber eingestellt ist mit: set -o | grep noclobber

  • Eine ausführlichere Erläuterung zu diesem speziellen Operatortyp finden Sie in diesem Beitrag

  • Eine ausführlichere Liste der Umleitungsoperatoren finden Sie in diesem Beitrag


@stimulate benutzt du die Bash Shell?
BrDaHa

@BrDaHa Wie kann ich stderr auch mit> | umleiten? auch? Ich habe versucht &> | aber es hat nicht funktioniert.
Tu Bui

@ TuBui nicht sicher, warum es nicht für Sie funktioniert. Auf meiner Maschine &>| filefunktioniert. Welche Shell und Version verwenden Sie? @stimulate für zsh sollten beide funktionieren , für bash ist es nur>|
Griddo

@Griddo meine Shell ist Bash Version 4.3.48 (1) -Veröffentlichung. echo "aaa" &>| test.txtführt zu einem Fehler -bash: syntax error near unexpected token |. Mein Noclobber ist eingeschaltet.
Tu Bui

1
@ TuBui Anscheinend habe ich nicht richtig getestet. Es funktioniert auch nicht für mich ... aber die Dokumentation besagt nicht, dass es sowieso möglich sein sollte. Sie müssen sich wahrscheinlich an eine echo "aaa" >| test.txt 2>&1andere Shell halten oder diese verwenden.
Griddo

40

Trotz NylonSmileder Antwort , die "irgendwie" richtig ist. Ich konnte Dateien auf diese Weise nicht überschreiben .

echo "i know about Pipes, girlfriend" > thatAnswer

zsh: file exists: thatAnswer

um meine Probleme zu lösen .. musste ich verwenden ... >!, á la ..

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

Seien Sie vorsichtig damit ...


26
Dies bedeutet, dass Sie die nicht standardmäßige Option zsh NOCLOBBERfestgelegt haben. Verwenden Sie setopt clobber diese Option , um das Standardverhalten wiederherzustellen.
Michał Politowski

11

Wenn Ihre Umgebung kein Überschreiben zulässt >, verwenden Sie Pipe |und teestattdessen wie folgt:

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

Beachten Sie, dass dies auch auf dem Standard gedruckt wird. Falls dies unerwünscht ist, können Sie die Ausgabe /dev/nullwie folgt umleiten :

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


2

Wenn Sie sowohl std :: cerr als auch std :: cout in eine Datei umleiten möchten, während Sie noclobber gesetzt haben (dh set -o noclobber), können Sie den folgenden Code verwenden:

    cmd >|file.txt 2>&1

Weitere Informationen hierzu finden Sie unter https://stackoverflow.com/a/876242 .

Auch diese Antwort ist @ TuBuis Frage auf die Antwort @BrDaHa oben am 9. August 18 um 9:34.


0

So überschreiben Sie den Inhalt einer Datei in eine andere Datei. benutze Katze zB.

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

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

Um foobar zu überschreiben, können wir einen cat-Befehl wie unten verwenden

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

Geben Sie hier die Bildbeschreibung ein


"Jetzt Foobar überschreiben ..." - das >>wird angehängt, nicht überschrieben
Drenai

-2

Wenn Sie eine Ausgabe haben, die Fehler enthalten kann, möchten Sie möglicherweise ein kaufmännisches Und und ein Größer als verwenden, wie folgt:

my_task &> 'Users/Name/Desktop/task_output.log' Dadurch werden sowohl stderr als auch stdout in die Protokolldatei umgeleitet (anstelle von nur stdout).


6
Das mag wahr sein, hat aber nichts mit der Frage zu tun.
Deiwin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.