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 >>są 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.