ファイルに書き込みますが、存在する場合は上書きします


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

存在しない場合はファイルを作成し、すでに存在する場合は上書きするようにするにはどうすればよいですか。現在、このスクリプトは追加するだけです。


まあ..これは素晴らしいです。>>より少し早く>を確認しました。
ジョークスター、2013年

回答:


411

* nixパイプがどのように機能するかを少し理解すると役立ちます。

要するに、>>リダイレクト演算子は指定されたファイルの最後に行を追加>します。単一の「より大きい」は空になり、ファイルを上書きします。

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

9
一部の環境では、などを許可していません-bash: TheAccount.txt: cannot overwrite existing file
トムラッセル

16
また、>および>>出力リダイレクト演算子です。パイプ演算子は|です。
トムラッセル

22
@BrDaHaによる回答を参照してください。使用する>|既存の上書きを強制する
ジェイク

2
既存のファイルを上書きしないため、これは正解ではありません
iWizard

4
回答は、これらのコメントからの
@Jake

90

Bashでは、noclobber a laを設定しset -o noclobberている場合、構文を使用します>|

例えば:

echo "some text" >| existing_file

これは、ファイルがまだ存在しない場合にも機能します


  • noclobberが設定されているかどうかを確認します。 set -o | grep noclobber

  • この特殊なタイプの演算子の詳細については、この投稿を参照してください

  • リダイレクト演算子のより包括的なリストについては、この投稿を参照しください


@stimulate bashシェルを使用していますか?
BrDaHa 2018

@BrDaHa> |でstderrをリダイレクトする方法 同じように?試しました&> | しかし、それはうまくいきませんでした。
Tu Bui

@TuBuiはなぜそれがあなたのために働いていないのかわかりません。私のマシンで&>| fileは動作します。どのシェルとバージョンを使用していますか?zshの@stimulateは両方とも機能するはずですが、bashの場合のみ有効です>|
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

私の問題を解決するために..私は使用していた... >!áラ ...

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

明らかに、これに注意してください...


26
これは、デフォルト以外のzshオプションがNOCLOBBER設定されていることを意味します。setopt clobber デフォルトの動作に戻すために使用します。
のMichałPolitowski

11

ご使用の環境ででの上書きが許可されていない場合は>、パイプ|を使用し、tee代わりに次のようにします。

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

これはstdoutにも出力されることに注意してください。これが不要な場合は、/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は、上記の ' 8月9日18:9に提供されました。


0

あるファイルの内容を別のファイルに上書きすること。猫を使用してください。

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

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

foob​​arを上書きするには、次のようにcatコマンドを使用します。

cat bar.txt >> foobar.txt
cat foobar.txt

ここに画像の説明を入力してください


「これでfoobarを上書きします...」- >>上書きではなく追加です
ドレナイ

-2

エラーが発生する可能性のある出力がある場合は、次のようにアンパサンド大なり記号を使用できます。

my_task &> 'Users/Name/Desktop/task_output.log' これにより、stderrとstdoutの両方がログファイルにリダイレクトされます(stdoutのみではなく)。


6
それは本当かもしれませんが、質問とは無関係です。
Deiwin 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.