Ghi vào tệp, nhưng ghi đè lên nếu nó tồn tại


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

Làm thế nào để tôi tạo nó để nó tạo tập tin nếu nó không tồn tại, nhưng ghi đè lên nó nếu nó đã tồn tại. Ngay bây giờ kịch bản này chỉ cần nối thêm.


tốt..đây là tuyệt vời. Tôi thừa nhận> sớm hơn một chút so với >>.
Jokester

Câu trả lời:


411

Một chút hiểu biết về cách làm việc * ống nix sẽ giúp.

Nói tóm lại, >>toán tử chuyển hướng sẽ nối các dòng vào cuối tệp được chỉ định, trong đó, khi đơn lẻ lớn hơn >sẽ trống và ghi đè lên tệp.

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

9
Một số môi trường không cho phép với một cái gì đó như -bash: TheAccount.txt: cannot overwrite existing file.
Tom Russell

16
Ngoài ra, >>>là các toán tử chuyển hướng đầu ra . Người vận hành đường ống là |.
Tom Russell

22
Xem câu trả lời của @BrDaHa. Sử dụng >|để buộc ghi đè lên hiện tại
Jake

2
đây hoàn toàn không phải là câu trả lời vì nó sẽ không ghi đè lên tập tin hiện có
iWizard

4
Câu trả lời phải được cập nhật với câu trả lời của @ Jake từ những bình luận này, câu trả lời được chấp nhận là sai theo nhiều cách
rm.rf.etc

90

Trong Bash, nếu bạn đã đặt noclobber a la set -o noclobber, thì bạn sử dụng cú pháp>|

Ví dụ:

echo "some text" >| existing_file

Điều này cũng hoạt động nếu tập tin chưa tồn tại


  • Kiểm tra xem noclobber có được đặt với: set -o | grep noclobber

  • Để được giải thích chi tiết hơn về loại toán tử đặc biệt này, hãy xem bài đăng này

  • Để biết danh sách đầy đủ hơn các toán tử chuyển hướng, hãy tham khảo bài viết này


@stimulation bạn đang sử dụng bash shell?
BrDaHa

@BrDaHa Làm thế nào tôi cũng có thể chuyển hướng stderr với> | cũng? Tôi đã thử &> | nhưng nó không hoạt động.
Từ Bùi

@TuBui không chắc tại sao nó không hiệu quả với bạn. Trên máy của tôi &>| filekhông hoạt động. Bạn đang sử dụng shell và phiên bản nào? @stimulation cho zsh cả hai nên hoạt động , vì bash nó chỉ>|
Griddo

@Griddo shell của tôi là bash phiên bản 4.3.48 (1). echo "aaa" &>| test.txtkết quả do lỗi -bash: syntax error near unexpected token |. Noclobber của tôi được đặt trên.
Từ Bùi

1
@TuBui Rõ ràng tôi đã không kiểm tra chính xác. Nó cũng không hoạt động đối với tôi ... tuy nhiên tài liệu không nói rõ rằng dù sao thì nó cũng có thể. Bạn có thể phải dính echo "aaa" >| test.txt 2>&1hoặc sử dụng vỏ khác.
Griddo

40

Mặc dù NylonSmilecâu trả lời là "loại" chính xác .. Tôi không thể ghi đè lên các tệp, theo cách này ..

echo "i know about Pipes, girlfriend" > thatAnswer

zsh: file exists: thatAnswer

để giải quyết vấn đề của mình .. tôi đã phải sử dụng ... >!, á la ..

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

Rõ ràng, hãy cẩn thận với điều này ...


26
Điều này có nghĩa là bạn có bộ tùy chọn zsh không mặc định NOCLOBBER. Sử dụng setopt clobber để khôi phục hành vi mặc định.
Michał Politowski

11

Nếu môi trường của bạn không cho phép ghi đè bằng >, hãy sử dụng đường ống |teethay vào đó như sau:

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

Lưu ý điều này cũng sẽ in ra thiết bị xuất chuẩn. Trong trường hợp điều này là không mong muốn, bạn có thể chuyển hướng đầu ra /dev/nullnhư sau:

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


2

Chỉ cần lưu ý rằng nếu bạn muốn chuyển hướng cả std :: cerr và std :: cout sang một tệp trong khi bạn đã đặt noclobber (tức là set -o noclobber), bạn có thể sử dụng mã:

    cmd >|file.txt 2>&1

Thông tin thêm về điều này có thể được xem tại https://stackoverflow.com/a/876242 .

Ngoài ra câu trả lời của câu hỏi @ TuBui về câu trả lời @BrDaHa được cung cấp ở trên vào ngày 9 tháng 8 năm 18 lúc 9:34.


0

Để ghi đè nội dung của tệp này sang tệp khác. sử dụng mèo, vd.

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

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

Bây giờ để ghi đè lên foobar, chúng ta có thể sử dụng lệnh cat như dưới đây

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

nhập mô tả hình ảnh ở đây


"Bây giờ để ghi đè lên foobar ..." - đó >>là phần bổ sung, không ghi đè
Drenai

-2

Nếu bạn có đầu ra có thể có lỗi, bạn có thể muốn sử dụng ký hiệu lớn hơn, như sau:

my_task &> 'Users/Name/Desktop/task_output.log' điều này sẽ chuyển hướng cả stderr và stdout sang tệp nhật ký (thay vì chỉ xuất ra).


6
Điều đó có thể đúng, nhưng không liên quan đến câu hỏi.
Deiwin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.