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


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

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


ну .. это круто Я признал> немного раньше, чем >>.
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

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

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


@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


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.


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).


6
Это может быть правдой, но не имеет отношения к вопросу.
Дейвин
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.