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

a1o7rhls  于 2023-03-08  发布在  Unix
关注(0)|答案(9)|浏览(170)
echo "text" >> 'Users/Name/Desktop/TheAccount.txt'

我怎样才能让它创建一个不存在的文件,但是如果它已经存在的话,它会覆盖它,现在这个脚本只是附加。

kxe2p93d

kxe2p93d1#

>>重定向操作符将把行附加到指定文件的末尾,其中大于>的-as将清空并覆盖该文件。

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

9gm1akwq2#

在Bash中,如果已经将noclobber设置为la set -o noclobber,则使用语法>|
例如:

echo "some text" >| existing_file

如果文件尚不存在,此操作也有效

  • 检查noclobber是否设置为:set -o | grep noclobber
  • 有关此特殊类型运算符的更详细说明,请参见this post
  • 有关更详尽的重定向运算符列表,请参阅this post
wqnecbli

wqnecbli3#

尽管NylonSmile 's answer,这是“排序”正确..我无法覆盖文件,以这种方式..
echo "i know about Pipes, girlfriend" > thatAnswer
zsh: file exists: thatAnswer
为了解决我的问题..我不得不使用... >!á la..

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

很明显,小心点...

drkbr07n

drkbr07n4#

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

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

注意这也会打印到stdout。如果不需要这样做,您可以将输出重定向到/dev/null,如下所示:

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

lo8azlld5#

#!/bin/bash

cat <<EOF > SampleFile

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

EOF
voase2hg

voase2hg6#

需要注意的是,如果您希望在设置了noclobber(即set -o noclobber)的情况下将stderr和stdout重定向到一个文件,可以使用以下代码:

cmd >| file.txt 2>&1

有关这方面的更多信息,请访问https://stackoverflow.com/a/876242
此外,这个答案的@TuBui的问题的答案@BrDaHa提供了above在8月9日'18在9时34分。

piztneat

piztneat7#

如果文本是命令(如ls)的输出,则可以使用cat
设置noclobber时:

ls | cat>| TheAccount.txt

否则,您可以合并强制删除(无论文件是否存在)和ls命令:

file=TheAccount.txt && rm -f $file && ls | cat > $file
yqhsw0fo

yqhsw0fo8#

要将一个文件的内容覆盖到另一个文件,请使用单个大于号,使用两个将追加。

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

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

echo "this is foo, again" >> foobar.txt
cat foobar.txt
    > this is bar
    > this is foo, again

如其他答案中所述,如果设置了noclobber,则使用>|运算符。

r1wp621o

r1wp621o9#

如果您的输出可能有错误,则可能需要使用与号和大于号,如下所示:
my_task &> 'Users/Name/Desktop/task_output.log'这会将stderr和stdout重定向到日志文件(而不是仅重定向到stdout)。

相关问题