Dosyaya yaz, ancak varsa üzerine yaz


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

Nasıl yaparım, yoksa dosyayı oluşturur, ancak zaten varsa üzerine yazar. Şu anda bu komut dosyası ekleniyor.


iyi ... bu harika. >> 'Den biraz daha erken kabul ettim.
Jokester

Yanıtlar:


410

* Nix borularının nasıl çalıştığının biraz anlaşılması yardımcı olacaktır.

Kısacası, >>yeniden yönlendirme operatörü belirtilen dosyanın sonuna satır ekleyecektir; burada tek büyük >dosya dosyayı boşaltacak ve üzerine yazacaktır.

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

9
Bazı ortamlar buna benzer bir şeye izin vermiyor -bash: TheAccount.txt: cannot overwrite existing file.
Tom Russell

16
Ayrıca, >ve >>vardır çıkış yönlendirme operatörler. Boru operatörü |.
Tom Russell

22
@BrDaHa tarafından verilen cevaba bakınız. >|Mevcut üzerine yazmaya zorlamak için kullanın
Jake

2
bu doğru bir cevap değil çünkü mevcut dosyanın üzerine yazılmayacak
iWizard

4
Cevap, @ Jake'in bu yorumların cevabı ile güncellenmelidir , kabul edilen cevap çeşitli şekillerde yanlıştır
rm.rf.etc

90

Bash'te, noclobber a la ayarladıysanız set -o noclobber, sözdizimini kullanırsınız>|

Örneğin:

echo "some text" >| existing_file

Bu, dosya henüz mevcut değilse de çalışır


  • Noclobber öğesinin ayarlanıp ayarlanmadığını kontrol edin: set -o | grep noclobber

  • Operatörün bu özel tip bir daha ayrıntılı bir açıklama için bkz Bu yayını

  • Yönlendirme işleçlerinin daha kapsamlı bir listesi için bu gönderiye bakın


@stimulate bash kabuğunu kullanıyor musunuz?
BrDaHa

@BrDaHa stderr'ı> ile nasıl yeniden yönlendirebilirim? de? Denedim &> | ama işe yaramadı.
Tu Bui

@TuBui neden sizin için çalışmıyor emin değilim. Benim makinede &>| fileçalışır. Hangi kabuğu ve sürümü kullanıyorsunuz? @ zsh için uyarın her ikisi de çalışmalı , bash için sadece>|
Griddo

@Griddo benim kabuğum bash 4.3.48 (1) sürümü. echo "aaa" &>| test.txthata ile sonuçlanır -bash: syntax error near unexpected token |. Noclobber'ım Açık.
Tu Bui

1
@TuBui Görünüşe göre doğru test yapmıyordum. Benim için de işe yaramıyor ... ancak belgeler yine de mümkün olabileceğini belirtmiyor. Muhtemelen echo "aaa" >| test.txt 2>&1başka bir mermiye bağlı kalmak veya kullanmak zorundasınız .
Griddo

40

"Bu tür" doğru olan NylonSmilecevaba rağmen , dosyaların üzerine yazamadım, bu şekilde ..

echo "i know about Pipes, girlfriend" > thatAnswer

zsh: file exists: thatAnswer

sorunlarımı çözmek için .. Kullanmak zorundaydım ... >!, la ..

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

Açıkçası, buna dikkat et ...


26
Bu, varsayılan olmayan zsh seçeneğinin NOCLOBBERayarlandığı anlamına gelir . setopt clobber Varsayılan davranışı geri yüklemek için kullanın .
Michał Politowski

11

Ortamınızın ile üzerine yazmasını izin vermiyorsa >kullanım borusu, |ve teebunun yerine aşağıdaki gibi:

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

Bunun stdout'a da yazdırılacağını unutmayın. Bu istenmeyen durumlarda, çıktıyı /dev/nullaşağıdaki gibi yönlendirebilirsiniz :

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


2

Noclobber ayarınız (yani set -o noclobber) varken hem std :: cerr hem de std :: cout'u bir dosyaya yeniden yönlendirmek istiyorsanız, kodu kullanabilirsiniz:

    cmd >|file.txt 2>&1

Bununla ilgili daha fazla bilgi https://stackoverflow.com/a/876242 adresinde görülebilir .

Ayrıca bu cevabın @ TuBui'nin yukarıdaki 9BDaHa cevabı hakkındaki sorusu, 9 Ağustos 18, 9: 34'te sağlanmıştır .


0

Bir dosyanın içeriğini başka bir dosyaya yazmak için. kedi kullanın örn.

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

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

Şimdi foobarın üzerine yazmak için aşağıdaki gibi bir cat komutu kullanabiliriz

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

resim açıklamasını buraya girin


"Şimdi foobar üzerine yazmak için ...">>
ekliyor

-2

Hatalar içerebilecek bir çıktıya sahipseniz, aşağıdaki gibi bir ve işareti veya daha büyük bir değer kullanmak isteyebilirsiniz :

my_task &> 'Users/Name/Desktop/task_output.log' bu hem stderr hem de stdout'u günlük dosyasına yönlendirir (yalnızca stdout yerine).


6
Bu doğru olabilir, ancak soru ile ilgisi yoktur.
Deiwin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.