ファイルが見つからなかったことをrmが報告しないようにするにはどうすればよいですか?


155

rm多くのファイルを削除するためにBASHスクリプト内で使用しています。ファイルが存在しない場合があるため、多くのエラーが報告されます。このメッセージは必要ありません。rm静かにするコマンドをマニュアルページで検索しましたが-f、見つかった唯一のオプションは、説明から「存在しないファイルを無視し、プロンプトを表示しない」が正しい選択のようですが、名前が合わないようです、それで私はそれが意図しない結果になるかもしれないと心配しています。

  • ある-fオプションは沈黙に正しい方法rm?どうして呼ばれないの-q
  • このオプションは他に何をしますか?

4
-fを使用したくない場合は、読み取り専用としてマークしたファイルを削除します。
ピザ

回答:


209

の主な用途は、それ自体-fでは削除されないファイルを強制的に削除することrmです(特殊なケースとして、存在しないファイルを「削除」して、エラーメッセージを抑制します)。

エラーメッセージをリダイレクトすることもできます

$ rm file.txt 2> /dev/null

(またはオペレーティングシステムに相当するもの)。$? 呼び出し直後にの値をチェックしてrm、ファイルが実際に削除されたかどうかを確認できます。


3
--fGNU Coreutils rmで有効ですが、たまたまがの固有の略語であるため--forceです。短い形式-fはより明確で移植性に優れています。
キーストンプソン

私もそれを実現したかわかりません。--fここにのタイプミスがあり-fます。
chepner 2014年

2
2は何をし2>ますか?
Dan

@Maverick stderrに送信されたすべてのメッセージを、ターミナルに送信する代わりに/ dev / nullにリダイレクトします。
ベンジャミンノーラン

73

はい、-fこれに最適なオプションです。


一部のシステムでは、バックスラッシュを使用するまで、-fを使用しても余裕があるときにプロンプ​​トが表示されます。
vimdude 2013年

11
@vimdude:「一部のシステム」ではありません。この動作は、にマップさrmれるシェル関数またはエイリアスがあることを示していますrm -i
キーストンプソン2014年

28

-fは正しいフラグですが、テストオペレーターにとってはrmではありません

[ -f "$THEFILE" ] && rm "$THEFILE"

これにより、ファイルが存在し、通常のファイルであることを確認します(ディレクトリ、デバイスノードなどではありません)。


4
ただし、これには競合状態があり、本番スクリプトでは使用しないでください。
tripleee 2014

@tripleeeが指摘しているのは、「-f」テストとファイルの削除が任意の順序で完了できることです。これを実行する別の方法は次のとおりです。if [ -f "$THEFILE" ]; then rm "$THEFILE"; fiテストとファイルの削除手順を明示的に順次実行します。
robla

2
@roblaそのコードはより詳細な構文でまったく同じことを行います... &&!=&...テストは常にrmの前に行われますが、別のプロセスは技術的に(非常にまれですが)rmが実行される前に(シェル中に)削除できますテストが解釈された後のコード)。
テクノサウルス

テクノサウルス-おっと、あなたは正しい。@mmlacの質問に対する最良の答えは何だと思いますか?
robla '11年

3
確認のために、競合状態とは、testとの間でファイルが削除される可能性があることrmです。ここrmまでに実行できる方法はありませんtest。飛躍する前に見ることは、並行プログラミングにおける一般的な間違いです。実際に「飛躍」するとき、「ルック」の結果を信頼することはできません。これに対する解決策は、ロックまたはアトミック操作を使用することです。これがまさにあなたが望む理由rm -fであり、後者の例です。
tripleee

13

\rm -f file 見つからないことは報告されません。


4
-rは不要で危険です。
mahemoff 2013年

1
多くのファイルまたはディレクトリを想定しました。ユーザーの要求を読み直してください。そうすれば、彼はファイルのみを要求していたのです。だから私の答えを修正しました
vimdude 2013年

rmが行う前のバックスラッシュは何ですか?私にそれに対する答えが必要な人たちをお願いします。Windowsでは、cygwinのmakeバージョン4.1は\ rmを処理できませんが、3.75は正常に機能します。
アイマンサラ2017

2
@AymanSalahこのコンテキストのバックスラッシュは、実数をラップするすべての関数またはエイリアスをエスケープしますrm(1990年代初頭の一部のサイトでは、初心者がデータを削除してからシステム管理者を呼び出してファイルを取り戻すのを防ぐために人気がありました)。
tripleee

ありがとう-これで私の問題が解決しました。どうやら終了コードにより、&&-f を使用せずにチェーンを使用できるようになり、ファイルが見つからないと壊れます。
イゴール

5

rm -f「何か他のこと」を行う限り、確認を求められる状況では、サイレント削除が強制されます(-f省略形--forcerm。たとえば、自分が書き込み可能なディレクトリから、自分が書き込みできないファイルを削除しようとした場合。


-9

cshellでも同じ問題がありました。私の唯一の解決策は、スクリプトの "rm"の前のパターンに一致するダミーファイルを作成することでした。


7
それが本当に唯一の解決策でしたか?試しましたrm -frm filename >&/dev/null
キーストンプソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.