写入文件,但如果存在则将其覆盖


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

我如何制作它,以便在不存在的情况下创建文件,但在已经存在的情况下覆盖文件。现在,此脚本只是追加。


好..这太棒了。我承认>比>>早一点。
Jokester

Answers:


411

稍微了解一下* nix管道的工作原理将有所帮助。

简而言之,>>重定向操作符会将行添加到指定文件的末尾,其中-大于的>行将清空并覆盖文件。

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

9
某些环境不允许使用-bash: TheAccount.txt: cannot overwrite existing file
汤姆·罗素

16
另外,>>>输出重定向运算符。管道运算符为|
汤姆·罗素

22
参见@Br​​DaHa的回答。使用>|强制覆盖现有
杰克

2
这根本不是正确答案,因为它不会覆盖现有文件
iWizard

4
答案应使用来自这些评论
@Jake

90

在Bash中,如果您设置了noclobber a la set -o noclobber,那么您将使用以下语法>|

例如:

echo "some text" >| existing_file

如果文件尚不存在,这也适用


  • 检查是否设置了noclobber: set -o | grep noclobber

  • 有关此特殊类型的运算符的详细说明,请参阅此文章。

  • 有关重定向操作符的更详尽列表,请参阅此文章。


@stimulate您在使用bash shell吗?
BrDaHa

@BrDaHa我也如何使用> |重定向stderr 也一样 我试过了&> | 但这没用。
Tu Bui

@TuBui不确定为什么它不适合您。在我的机器上&>| file确实可以工作。您使用什么外壳和版本?@stimulate for zsh 都应该起作用>|
Griddo

@Griddo我的外壳是bash版本4.3.48(1)-发行版。echo "aaa" &>| test.txt导致错误-bash: syntax error near unexpected token |。我的noclobber设置为开。
Tu Bui

1
@TuBui显然我没有正确测试。它对我也不起作用...但是文档没有说明仍然应该可行。您可能必须坚持echo "aaa" >| test.txt 2>&1或使用其他外壳。
Griddo

40

尽管NylonSmile答案正确,但“是”正确的..我无法以这种方式覆盖文件。

echo "i know about Pipes, girlfriend" > thatAnswer

zsh: file exists: thatAnswer

解决我的问题。我不得不用... >!A LA ..

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

显然,对此要小心...


26
这意味着您设置了非默认的zsh选项NOCLOBBER。使用setopt clobber 还原默认行为。
米哈尔Politowski

11

如果您的环境不允许>使用覆盖,请使用pipe |tee如下所示:

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

请注意,这还将打印到标准输出。如果不需要,可以将输出重定向到/dev/null如下位置:

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


2

请注意,如果您希望在设置了noclobber的同时(例如set -o noclobber)将std :: cerr和std :: cout都重定向到文件,则可以使用以下代码:

    cmd >|file.txt 2>&1

有关此的更多信息,参见https://stackoverflow.com/a/876242

另外这个答案是@ TuBui对所提供的答案@BrDaHa问题上面在9:34在8月9日'18。


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
可能是正确的,但与问题无关。
Deiwin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.