Записать в файл, но перезаписать, если он существует
252
echo "text">>'Users/Name/Desktop/TheAccount.txt'
Как мне сделать так, чтобы он создавал файл, если он не существует, но перезаписывал его, если он уже существует. Прямо сейчас этот скрипт просто добавляется.
ну .. это круто Я признал> немного раньше, чем >>.
Jokester
Ответы:
411
Небольшое понимание того, как работают * nix pipe, поможет.
Короче говоря, >>оператор перенаправления будет добавлять строки в конец указанного файла, где-как единица больше, чем >будет пустой и перезаписать файл.
@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
чтобы решить мои проблемы .. Я должен был использовать ... >!, а ля ..
Это означает, что у вас установлена опция не по умолчанию 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
Просто отметив, что если вы хотите перенаправить как std :: cerr, так и std :: cout в файл, когда у вас установлен noclobber (то есть set -o noclobber), вы можете использовать код:
Ответы:
Небольшое понимание того, как работают * nix pipe, поможет.
Короче говоря,
>>
оператор перенаправления будет добавлять строки в конец указанного файла, где-как единица больше, чем>
будет пустой и перезаписать файл.источник
-bash: TheAccount.txt: cannot overwrite existing file
.>
и>>
есть операторы перенаправления вывода . Трубный оператор есть|
.>|
для принудительной перезаписи существующегоВ Bash, если вы установили noclobber а-ля
set -o noclobber
, то вы используете синтаксис>|
Например:
echo "some text" >| existing_file
Это также работает, если файл еще не существует
Проверьте, установлен ли noclobber с помощью:
set -o | grep noclobber
Более подробное объяснение этого особого типа оператора смотрите в этом посте.
Для более полного списка операторов перенаправления, обратитесь к этому сообщению
источник
&>| file
работает. Какую оболочку и версию вы используете? @stimulate для zsh оба должны работать , для bash это только>|
echo "aaa" &>| test.txt
приводит к ошибке-bash: syntax error near unexpected token |
. Мой ноклоббер включен.echo "aaa" >| test.txt 2>&1
или использовать другую оболочку.Несмотря
NylonSmile
на ответ , который является "своего рода" правильным .. Я не смог перезаписать файлы, таким образом ..echo "i know about Pipes, girlfriend" > thatAnswer
чтобы решить мои проблемы .. Я должен был использовать ...
>!
, а ля ..Очевидно, будьте осторожны с этим ...
источник
NOCLOBBER
. Используйтеsetopt clobber
для восстановления поведения по умолчанию.Если ваша среда не позволяет перезаписывать с помощью
>
, используйте pipe|
иtee
вместо этого:Обратите внимание, что это также будет печатать на стандартный вывод. В случае, если это нежелательно, вы можете перенаправить вывод
/dev/null
следующим образом:источник
источник
Просто отметив, что если вы хотите перенаправить как std :: cerr, так и std :: cout в файл, когда у вас установлен noclobber (то есть
set -o noclobber
), вы можете использовать код:Более подробную информацию об этом можно увидеть на https://stackoverflow.com/a/876242 .
Также ответ на этот вопрос @ TuBui об ответе @BrDaHa, представленном выше в 9 августа 18 августа в 9:34.
источник
Перезаписать содержимое одного файла в другой файл. использовать кошку, например.
Теперь, чтобы перезаписать foobar, мы можем использовать команду cat, как показано ниже
источник
>>
Если у вас есть выходные данные, которые могут иметь ошибки, вы можете использовать амперсанд и значение больше чем, как показано ниже:
my_task &> 'Users/Name/Desktop/task_output.log'
это перенаправит как stderr, так и stdout в файл журнала (вместо только stdout).источник