2017-03-07 2 views
6

私はシェルスクリプトを持っていて、ログファイルが存在する場合にのみログファイルを削除する行を追加したいのです。現在、私のスクリプトは、単にん:ファイル名が存在しない場合はファイルが存在する場合のみ削除できますか?

rm filename.log 

は、しかし、私はファイル名.logが存在しないというメッセージを取得し、削除することはできません。これは理にかなっていますが、私はスクリプトを実行するたびにそれを見続けたくありません。私はこれを行うことができますIFステートメントでよりスマートな方法はありますか?

+1

存在しないファイルを削除することはまったく不可能なので、「存在する場合にのみファイルを削除する」という概念は冗長です。したがって、 'rm -f filename'、' rm filename 2 >>/dev/null'、 '[[-r filename]] && rm filename'はいくつかのオプションになります.. – twalberg

答えて

18

は、名前のファイルが成功として存在しない場合、それは状況を治療するための原因となる、rm-f引数を渡し、その場合のいずれかのエラーメッセージを抑制します:

rm -f -- filename.log 

を何文字通り以上のようになるため質問:

[ -e filename.log ] && rm -- filename.log 

が、タイプするより多くのだと、余分な故障モードが追加されます。 ([がそれをテストした後にファイルを削除したが、rmがそれを削除する前にファイルを削除した場合は、もう一度エラーが発生した)。

一方、先頭のダッシュで始まっても、ファイル名はリテラルとして扱われます。あなたの名前が変数から来ている場合や厳密に管理されていない場合は、これらを常習的に使用する必要があります。

+0

これらのオプションは非常にうまく機能しました!ありがとうチャールズ!! – user7649922

+0

提案されている解決策は、質問の要件を正確に満たしていない可能性があります。ファイルが存在し、書き込み保護されている場合は、オリジナルの解決策でエラーメッセージが表示されますが、ファイルはCharles Duffysソリューションによってサイレントに削除されます。 – user1934428

+0

@ user1934428、私は、この行動の変化が逆転するという問題の要件は見当たりません。あなたはそれが与えられた場所を綴ることができますか? –

1
if [ ! -f 'absolute path of file' ] 
then 
    echo "File does not exist. Skipping..." 
else 
    rm 'absolute path of file' 
fi 

次のコードを使用するとうまくいくはずです。

+0

OPは'rm'と' echo'との間には、ロジックが反転しているようです。パスが絶対的である必要はありません。 –

+0

チャールズ!ありがとう。ファイルの削除ログインを追加するように更新します。 if式は、ファイルが存在しないかどうかをテストし、ファイルが見つからない場合にのみ追跡するために文をスキップして出力します。 –

+0

Rajesh、私はプロポーザルを使用しようとしましたが、次のエラーが表示されます。[:missing ']'私はあなたのアプローチもチャールズと一緒に試みます! – user7649922

0

ファイルを最初にタッチします。ファイルが存在しない場合は作成されますが、の場合はの場合にのみタイムスタンプが変更されます。

touch filename && rm filename 

効率的ではありませんが、覚えやすいです。

関連する問題