すでに存在するファイルを削除するシェルスクリプト


183

私はファイルにデータを保存しているところに取り組んでいます。しかし、スクリプトを実行するたびに、前のファイルに追加されます。

ファイルが既に存在する場合に削除する方法を教えてください。


3
ファイルが存在するかどうかを確認してから、を呼び出しrm $my_fileますか?どのシェルを使用していますか?
Chris Sprague

回答:


184

ファイルが存在するかどうかを確認する必要はありません。削除してみてください。

rm -f /p/a/t/h
# or
rm /p/a/t/h 2> /dev/null

ファイルが存在しない場合、2番目のコマンドは失敗します(ゼロ以外の終了ステータスを返します)が、最初のコマンドは-f(の省略形--force)オプションにより成功することに注意してください。状況によっては、これは重要な詳細になる場合があります。

しかし、より可能性が高いのは、ファイルに追加する場合は、スクリプトが>>何かをファイルにリダイレクトするために使用しているためです。で置き換え>>てください>。コードを提供していないので、言うのは難しいです。

のようなことができますtest -f /p/a/t/h && rm /p/a/t/hが、そうすることは完全に無意味です。テストがtrueを返しても、削除しようとする前に/ p / a / t / hが存在しなかったり、さらに悪いことに、テストが失敗して/ p / a / t / hが作成されたりする可能性があります。あなたがそれが存在しないことを期待する次のコマンドを実行する前に。これを試みることは古典的な競合状態です。しないでください。


5
これが存在していて削除されたかどうかを知る必要がある場合、これは役に立ちません。stderrを食べることはそれを提供しません。存在を処理しないと、失敗することなく幅広いスクリプトを実行できません。
uchuugaka 2017年

ファイルがある場合は、あなたが気にしないとき@uchuugakaこれは、あなたが望むすべてがそれだことを確認することです、簡単な解決策であるではないが。
Lukas Liesis、

副作用についての良い答えは近づいていて完全でなければなりませんが、私のメッセージの一般化ですが、シェルスクリプトは頻繁に何が見つかり、何が見つからないか、何が行われるか、何が行われないかを知りたがります。
uchuugaka

rm /p/a/t/h 2> /dev/nullecho $?ファイルが存在しない場合、戻りコード()を0として保持しません。存在しないファイルを削除しようとしたからといって、Jenkinsの種類のジョブは失敗します。
ViFI

@uchuugaka-このコメントへの返信をかなり前から避けてきましたが、対処する必要があります。削除する前にファイルが存在するかどうかを確認することは常に悪い考えです。私の回答の最後の段落をご覧ください。この種のことを行うだけでは避けられない固有の競合状態があります。既存のファイルを上書きしたくない場合は、シェル固有の魔法(noclobberbashなど)を試すか、ファイルが存在する場合に競合が発生しないように既存のファイルをchmodして(競合状態を回避しないで)、しかし、それでできることは、バグをより微妙にすることです。
ウィリアムパーセル

127

私が使用した別の1行コマンドは次のとおりです。

[ -e file ] && rm file

11
または、代わりに:[!-eファイル] || rmファイル。このバージョンは、いくつかのエラーの代わりに0を返します。
nawfel bgh 2017

@nawfelbghおかげで、これは長いスクリプトの連鎖に最適です。
阿部

83

あなたはこれを使うことができます:

#!/bin/bash

file="file_you_want_to_delete"

if [ -f $file ] ; then
    rm $file
fi

4
これが選択された答えです。
ingernet 2018年

シンプルで読みやすくecho $?、ファイルが存在しない場合でも1にならないようにします。
ViFI

必要に応じて、これをワンライナーとして行うこともできます。以下の私の回答を参照してください。
nbeuchat

65

ファイルが存在するかどうかを確認する手順を無視する場合は、かなり簡単なコマンドを使用できます。このコマンドは、ファイルが存在する場合は削除し、存在しない場合はエラーをスローしません。

 rm -f xyz.csv

1
これは、2015
forgivenson

16
主な答えは、-fそれがエラーをスローしないことを説明していませんでした。この答えは私に役立ちました、ありがとう。
Doug

Dougに同意しますが、これはwikiのような応答の編集に適したユースケースのようです。
フィリップ

16

(Jindra Helclの回答に基づいて)ファイルが既に存在する場合にそれを削除するためのワンライナーシェルスクリプト:

[ -f file ] && rm file

または変数を使用して:

#!/bin/bash

file="/path/to/file.ext"
[ -f $file ] && rm $file

13

このようなものはうまくいくでしょう

#!/bin/sh

if [ -fe FILE ]
then 
    rm FILE
fi 

-fはそれが通常のファイルかどうかをチェックします

-eは、ファイルが存在するかどうかを確認します

ifの詳細情報

編集: -fと一緒に使用される-eは冗長です。-fを単独で使用する場合も機能します。


-a廃止予定です-e。代わりに使用してください。
mziccard 2015

私の悪い、修正済み。ありがとう@mziccard
P1kachu 2015

これにより、ディレクトリ、リンク、またはその他の通常以外のファイルでエラーがスローされます。使用する方が良い/安全-fです。
Jindra Helcl

1
OK。それでも、-e中には-fe同様に、冗長で-fも...私の知る限りでは、ファイルの存在をチェックする
Jindra Helcl

編集する場合、私はあなたの回答を複製しますが、私はそれを正確にします
P1kachu 2015

4

if [ $( ls <file> ) ]; then rm <file>; fi

また、出力を>代わりにリダイレクトすると>>、以前のファイルが上書きされます


3
これはワンライナーではありません。申し訳ありませんが、@ liwp_Stephenのものはそれです。
fiorentinoing 2016年

適切に引用されていたとしても、これfileは次のようなものであれば壊れます5 -lt 2
ウィリアムパーセル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.