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.

switz
quelle
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'
Nylon Lächeln
quelle
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

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

Alex Gray
quelle
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
Computerist
quelle
6
#!/bin/bash

cat <<EOF > SampleFile

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

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

Greensaxman
quelle
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

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

Aaron-Codierung
quelle
6
Das mag wahr sein, hat aber nichts mit der Frage zu tun.
Deiwin