Tulis ke file, tetapi timpa jika ada

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

Bagaimana cara membuatnya sehingga membuat file jika tidak ada, tetapi menimpanya jika sudah ada. Saat ini skrip ini baru ditambahkan.

switz
sumber
yah..ini mengagumkan. Saya mengakui> sedikit lebih awal dari >>.
Jokester

Jawaban:

411

Sedikit pemahaman tentang cara kerja pipa * nix akan membantu.

Singkatnya >>operator pengalihan akan menambahkan baris ke akhir file yang ditentukan, di mana-sebagai tunggal lebih besar dari >akan mengosongkan dan menimpa file.

echo "text" > 'Users/Name/Desktop/TheAccount.txt'
Senyum Nylon
sumber
9
Beberapa lingkungan tidak suka dengan sesuatu seperti -bash: TheAccount.txt: cannot overwrite existing file.
Tom Russell
16
Juga, >dan >>merupakan operator pengalihan output . Operator pipa adalah |.
Tom Russell
22
Lihat jawaban oleh @BrDaHa. Gunakan >|untuk memaksa menimpa yang sudah ada
Jake
2
ini bukan jawaban yang benar sama sekali karena itu tidak akan menimpa file yang ada
iWizard
4
Jawabannya harus diperbarui dengan jawaban @ Jake dari komentar ini, jawaban yang diterima salah dalam banyak hal
rm.rf.etc
90

Di Bash, jika Anda telah menetapkan noclobber a la set -o noclobber, maka Anda menggunakan sintaks>|

Sebagai contoh:

echo "some text" >| existing_file

Ini juga berfungsi jika file belum ada


  • Periksa apakah noclobber diatur dengan: set -o | grep noclobber

  • Untuk penjelasan lebih rinci tentang jenis operator khusus ini, lihat posting ini

  • Untuk daftar operator pengalihan yang lebih lengkap, lihat pos ini

BrDaHa
sumber
@stimulasi apakah Anda menggunakan bash shell?
BrDaHa
@BrDaHa Bagaimana saya bisa mengarahkan ulang stderr dengan> | demikian juga? Saya mencoba &> | tapi itu tidak berhasil.
Tu Bui
@ TuBui tidak yakin mengapa itu tidak berhasil untuk Anda. Di mesin saya &>| filebekerja. Shell dan versi apa yang Anda gunakan? @stimulasi untuk zsh keduanya harus bekerja , untuk bash itu hanya>|
Griddo
@Griddo shell saya adalah bash versi 4.3.48 (1) -release. echo "aaa" &>| test.txtmengakibatkan kesalahan -bash: syntax error near unexpected token |. Noclobber saya disetel ke Hidup.
Tu Bui
1
@ TuBui Tampaknya saya tidak menguji dengan benar. Ini juga tidak berfungsi untuk saya ... namun dokumentasinya tidak menyatakan bahwa itu harus dimungkinkan. Anda mungkin harus tetap echo "aaa" >| test.txt 2>&1menggunakan atau menggunakan shell lain.
Griddo
40

Meskipun NylonSmilejawaban , yang "semacam" benar .. Saya tidak dapat menimpa file, dengan cara ini ..

echo "i know about Pipes, girlfriend" > thatAnswer

zsh: file exists: thatAnswer

untuk menyelesaikan masalah saya .. Saya harus menggunakan ... >!, á la ..

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

Jelas, berhati-hatilah dengan ini ...

Alex Gray
sumber
26
Ini berarti Anda telah NOCLOBBERmenetapkan opsi zsh non-default . Gunakan setopt clobber untuk mengembalikan perilaku default.
Michał Politowski
11

Jika lingkungan Anda tidak mengizinkan penimpaan >, gunakan pipa |dan teeganti sebagai berikut:

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

Catatan ini juga akan mencetak ke stdout. Dalam hal ini tidak diinginkan, Anda dapat mengarahkan output ke /dev/nullsebagai berikut:

echo "text" | tee 'Users/Name/Desktop/TheAccount.txt' > /dev/null
komputeris
sumber
6
#!/bin/bash

cat <<EOF > SampleFile

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

EOF
Balaji Boggaram Ramanarayan
sumber
2

Hanya mencatat bahwa jika Anda ingin mengarahkan kembali std :: cerr dan std :: cout ke file saat Anda memiliki set noclobber (yaitu set -o noclobber), Anda dapat menggunakan kode:

    cmd >|file.txt 2>&1

Informasi lebih lanjut tentang ini dapat dilihat di https://stackoverflow.com/a/876242 .

Juga pertanyaan @ TuBui jawaban ini pada jawaban @BrDaHa disediakan di atas pada 9 Agustus '18 pada 9:34.

greensaxman
sumber
0

Untuk menimpa konten satu file ke file lain. gunakan kucing misalnya.

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

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

Sekarang untuk menimpa foobar kita dapat menggunakan perintah cat seperti di bawah ini

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

masukkan deskripsi gambar di sini

Narendra Maru
sumber
"Sekarang untuk menimpa foobar ..." - >>itu menambahkan, bukan menimpa
Drenai
-2

Jika Anda memiliki output yang dapat memiliki kesalahan, Anda mungkin ingin menggunakan ampersand dan lebih besar dari, sebagai berikut:

my_task &> 'Users/Name/Desktop/task_output.log' ini akan mengarahkan ulang stderr dan stdout ke file log (bukan hanya stdout).

aaron-coding
sumber
6
Itu mungkin benar, tetapi tidak ada hubungannya dengan pertanyaan.
Deiwin