Записать в файл, но перезаписать, если он существует

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

Как мне сделать так, чтобы он создавал файл, если он не существует, но перезаписывал его, если он уже существует. Прямо сейчас этот скрипт просто добавляется.

Switz
источник
ну .. это круто Я признал> немного раньше, чем >>.
Jokester

Ответы:

411

Небольшое понимание того, как работают * nix pipe, поможет.

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

echo "text" > 'Users/Name/Desktop/TheAccount.txt'
Нейлоновая улыбка
источник
9
Некоторые среды запрещают что-то подобное -bash: TheAccount.txt: cannot overwrite existing file.
Том Рассел
16
Также >и >>есть операторы перенаправления вывода . Трубный оператор есть |.
Том Рассел
22
Смотрите ответ @BrDaHa. Используйте >|для принудительной перезаписи существующего
Джейк
2
это
неверный
4
Ответ должен быть дополнен ответом @ Jake из этих комментариев, принятый ответ неверен несколькими способами
rm.rf.etc
90

В Bash, если вы установили noclobber а-ля set -o noclobber, то вы используете синтаксис>|

Например:

echo "some text" >| existing_file

Это также работает, если файл еще не существует


  • Проверьте, установлен ли noclobber с помощью: set -o | grep noclobber

  • Более подробное объяснение этого особого типа оператора смотрите в этом посте.

  • Для более полного списка операторов перенаправления, обратитесь к этому сообщению

BrDaHa
источник
@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 |. Мой ноклоббер включен.
Ту Буй
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 для восстановления поведения по умолчанию.
Михал Политовски
11

Если ваша среда не позволяет перезаписывать с помощью >, используйте pipe |и teeвместо этого:

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

Обратите внимание, что это также будет печатать на стандартный вывод. В случае, если это нежелательно, вы можете перенаправить вывод /dev/nullследующим образом:

echo "text" | tee 'Users/Name/Desktop/TheAccount.txt' > /dev/null
computerist
источник
6
#!/bin/bash

cat <<EOF > SampleFile

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

EOF
Баладжи Боггарам Раманараян
источник
2

Просто отметив, что если вы хотите перенаправить как std :: cerr, так и std :: cout в файл, когда у вас установлен noclobber (то есть set -o noclobber), вы можете использовать код:

    cmd >|file.txt 2>&1

Более подробную информацию об этом можно увидеть на https://stackoverflow.com/a/876242 .

Также ответ на этот вопрос @ TuBui об ответе @BrDaHa, представленном выше в 9 августа 18 августа в 9:34.

greensaxman
источник
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

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

Нарендра Мару
источник
«Теперь переписать foobar ...»>>
добавляется
-2

Если у вас есть выходные данные, которые могут иметь ошибки, вы можете использовать амперсанд и значение больше чем, как показано ниже:

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

Aaron-кодирования
источник
6
Это может быть правдой, но не имеет отношения к вопросу.
Дейвин