Zapisz do pliku, ale zastąp go, jeśli istnieje

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

Jak to zrobić, aby tworzył plik, jeśli nie istnieje, ale zastępuje go, jeśli już istnieje. W tej chwili ten skrypt po prostu się dołącza.

switz
źródło
cóż ... to jest niesamowite. Potwierdziłem> trochę wcześniej niż >>.
Jokester 13.01.11

Odpowiedzi:

411

Przydałoby się trochę zrozumienia działania * rur * nix.

Krótko mówiąc, >>operator przekierowania doda linie na końcu określonego pliku, gdzie jako pojedynczy większy niż >opróżni i nadpisze plik.

echo "text" > 'Users/Name/Desktop/TheAccount.txt'
Nylonowy uśmiech
źródło
9
Niektóre środowiska nie pozwalają na coś takiego -bash: TheAccount.txt: cannot overwrite existing file.
Tom Russell
16
Także >i >>wyjściowymi operatorami przekierowania . Operator rur jest |.
Tom Russell
22
Zobacz odpowiedź @BrDaHa. Użyj, >|aby wymusić zastąpienie istniejącego
Jake
2
to wcale nie jest poprawna odpowiedź, ponieważ nie zastąpi istniejącego pliku
iWizard
4
Odpowiedź powinna zostać zaktualizowana odpowiedzią @ Jake'a z tych komentarzy, zaakceptowana odpowiedź jest zła na wiele sposobów
rm.rf.etc
90

W Bash, jeśli ustawiłeś noclobber a la set -o noclobber, wówczas używasz składni>|

Na przykład:

echo "some text" >| existing_file

Działa to również, jeśli plik jeszcze nie istnieje


  • Sprawdź, czy noclobber jest ustawiony za pomocą: set -o | grep noclobber

  • Bardziej szczegółowe wyjaśnienie tego szczególnego rodzaju operatora znajduje się w tym poście

  • Bardziej wyczerpującą listę operatorów przekierowań znajdziesz w tym poście

BrDaHa
źródło
@stimulate czy używasz powłoki bash?
BrDaHa,
@BrDaHa Jak mogę również przekierować stderr za pomocą> | także? Próbowałem i> | ale to nie zadziałało.
Tu Bui,
@TuBui nie jestem pewien, dlaczego to nie działa dla Ciebie. Na mojej maszynie &>| filedziała. Jakiej powłoki i wersji używasz? @stimulate dla zsh oba powinny działać , dla bash to tylko>|
Griddo
@Griddo moja powłoka to wersja bash 4.3.48 (1) -release. echo "aaa" &>| test.txtpowoduje błąd -bash: syntax error near unexpected token |. Mój noclobber jest włączony.
Tu Bui
1
@TuBui Najwyraźniej nie testowałem poprawnie. Dla mnie to też nie działa ... jednak dokumentacja nie stwierdza, że ​​i tak powinno być możliwe. Prawdopodobnie będziesz musiał trzymać się echo "aaa" >| test.txt 2>&1lub używać innej powłoki.
Griddo
40

Mimo NylonSmileodpowiedzi , która jest „w pewnym sensie poprawna”, nie byłem w stanie nadpisać plików, w ten sposób…

echo "i know about Pipes, girlfriend" > thatAnswer

zsh: file exists: thatAnswer

aby rozwiązać moje problemy .. Musiałem użyć ... >!, á la ..

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

Oczywiście uważaj na to ...

Alex Gray
źródło
26
Oznacza to, że masz ustawioną domyślną opcję zsh NOCLOBBER. Użyj, setopt clobber aby przywrócić domyślne zachowanie.
Michał Politowski
11

Jeśli twoje środowisko nie pozwala na nadpisywanie >, użyj potoku |i teezamiast tego:

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

Zauważ, że to również wydrukuje na standardowe wyjście. Jeśli jest to niepożądane, możesz przekierować dane wyjściowe /dev/nullw następujący sposób:

echo "text" | tee 'Users/Name/Desktop/TheAccount.txt' > /dev/null
informatyk
źródło
6
#!/bin/bash

cat <<EOF > SampleFile

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

EOF
Balaji Boggaram Ramanarayan
źródło
2

Wystarczy zauważyć, że jeśli chcesz przekierować zarówno std :: cerr, jak i std :: cout do pliku, gdy masz ustawiony noclobber (tj. set -o noclobber), Możesz użyć kodu:

    cmd >|file.txt 2>&1

Więcej informacji na ten temat można znaleźć na stronie https://stackoverflow.com/a/876242 .

Również ta odpowiedź na pytanie @ TuBui na odpowiedź @BrDaHa podana powyżej w dniu 9 sierpnia 18 o 9:34.

greensaxman
źródło
0

Aby zastąpić zawartość jednego pliku innym plikiem. użyj kota np.

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

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

Teraz, aby zastąpić foobar, możemy użyć polecenia kota, jak poniżej

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

wprowadź opis zdjęcia tutaj

Narendra Maru
źródło
„Teraz, aby zastąpić foobar ...” - >>dodaje, nie zastępuje
Drenai
-2

Jeśli masz dane wyjściowe, które mogą zawierać błędy, możesz użyć znaku handlowego „ ampersand” i większego niż w następujący sposób:

my_task &> 'Users/Name/Desktop/task_output.log' spowoduje to przekierowanie zarówno stderr, jak i stdout do pliku dziennika (zamiast tylko stdout).

kodowanie Aarona
źródło
6
To może być prawda, ale nie ma to związku z pytaniem.
Deiwin