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.


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'

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


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


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


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.


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


„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).


6
To może być prawda, ale nie ma to związku z pytaniem.
Deiwin
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.