Напишіть у файл, але перезапишіть його, якщо він існує


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

Як зробити це, щоб він створив файл, якщо його не існує, але перезаписав його, якщо він вже існує. Зараз цей сценарій просто додається.


ну .. це дивовижно. Я визнав> трохи раніше, ніж >>.
Джокестер

Відповіді:


411

Трохи розуміння того, як працюють * нікс-труби, допоможе.

Коротше кажучи, >>оператор перенаправлення додасть рядки до кінця зазначеного файлу, де - як сингл більше, ніж >буде порожнім і перезапише файл.

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

9
Деякі середовища забороняють щось подібне -bash: TheAccount.txt: cannot overwrite existing file.
Том Расселл

16
Крім того , >і >>є вихідним перенаправлення операторів. Оператор труби є |.
Том Расселл

22
Дивіться відповідь @BrDaHa. Використовуйте >|для примусового перезапису існуючого
Джейк

2
це зовсім не правильна відповідь, оскільки він не перезапише існуючий файл
iWizard

4
Відповідь слід
доповнити

90

Якщо в Bash ви встановили noclobber a la set -o noclobber, тоді ви використовуєте синтаксис>|

Наприклад:

echo "some text" >| existing_file

Це також працює, якщо файл ще не існує


  • Перевірте, чи встановлено noclobber за допомогою: set -o | grep noclobber

  • Більш детальне пояснення щодо цього спеціального типу оператора див. У цій публікації

  • Більш вичерпний список операторів перенаправлення див. У цій публікації


@stimulate Ви використовуєте оболонку bash?
BrDaHa

@BrDaHa Як я можу також перенаправити stderr за допомогою> | також? Я спробував &> | але це не спрацювало.
Ту Буй

@TuBui не впевнений, чому це не працює для тебе. На моїй машині &>| fileпрацює. Яку оболонку та версію ви використовуєте? @stimulate для zsh обидва повинні працювати , для bash це тільки>|
Griddo

@Griddo моя оболонка - це версія bash 4.3.48 (1). echo "aaa" &>| test.txtпризводить до помилки -bash: syntax error near unexpected token |. Мій noclobber увімкнено.
Ту Буй

1
@TuBui Мабуть, я не перевіряв правильно. Для мене це також не працює ... проте в документації не зазначено, що це все одно можливо. Можливо, вам доведеться дотримуватися echo "aaa" >| test.txt 2>&1або використовувати іншу оболонку.
Гріддо

40

Незважаючи NylonSmileна відповідь ' , яка є "своєрідною" правильною. Я не зміг перезаписати файли таким чином ..

echo "i know about Pipes, girlfriend" > thatAnswer

zsh: file exists: thatAnswer

щоб вирішити свої питання .. Мені довелося використовувати ... >!, ла ..

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

Очевидно, будьте обережні з цим ...


26
Це означає, що у вас встановлена ​​опція zsh за замовчуванням NOCLOBBER. Використовуйте setopt clobber для відновлення поведінки за замовчуванням.
Michał Politowski

11

Якщо ваше середовище не дозволяє перезаписати >, використовуйте pipe |та teeзамість цього:

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

Зверніть увагу, це також буде надруковано у stdout. У випадку, якщо це небажано, ви можете перенаправити висновок /dev/nullтаким чином:

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


2

Тільки зазначивши, що якщо ви хочете перенаправити як std :: cerr, так і std :: cout у файл, поки у вас не встановлено noclobber (тобто set -o noclobber), ви можете використовувати код:

    cmd >|file.txt 2>&1

Більше інформації про це можна переглянути на веб- сайті https://stackoverflow.com/a/876242 .

Також відповідь на питання @ TuBui щодо відповіді @BrDaHa подано вище 9 серпня 188 о 9:34.


0

Щоб перезаписати вміст одного файлу в інший файл. використовувати кішку, наприклад.

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

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

Тепер, щоб замінити foobar, ми можемо використовувати команду cat, як показано нижче

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

введіть тут опис зображення


"Тепер перезаписати фобар ..." - >>додавання, не перезапис
Дренай

-2

Якщо у вас є вихід, який може мати помилки, ви можете використовувати амперсанд і більше, ніж наступне:

my_task &> 'Users/Name/Desktop/task_output.log' це перенаправить і stderr, і stdout у файл журналу (замість лише stdout).


6
Це може бути правдою, але це питання не пов'язане.
Дейвін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.