ファイルが存在しない場合にrmがエラーを出さないようにするにはどうすればよいですか?


329

コンパイルの最後にいくつかの役に立たないファイルをクリーンアップするメイクファイルを書いています。ターゲットがすでに作成されている場合、もちろんそのターゲットはスキップされ、無用なファイルはそこにない場合があります。だから私がこれを行うと:

rm lexer.ml interpparse.ml interpparse.mli

ファイルの1つが存在しないため、エラーが発生する場合があります。rmこれらのファイルを無視するように指示する方法はありますか?

manページを読むと、次のオプションが表示されます。

 -f          Attempt to remove the files without prompting for confirma-
             tion, regardless of the file's permissions.  If the file does
             not exist, do not display a diagnostic message or modify the
             exit status to reflect an error.  The -f option overrides any
             previous -i options.

それはほとんど私が望むもののように聞こえますが、アクセス許可の部分については本当にわかりません。これを行う方法はありますか?


rmサンドボックスで試してみましたか?-fグロビングに関係なく、まさにあなたが望むことをするように見えます。
JMD

許可で許可されない場合、rmは-fオプションで削除を試みます。失敗します。失敗したことはわかりません。ファイル名が変数またはグロブの場合に役立ちます。
ローレンス

完全を期すために、エラー終了ステータスを返す以外rm --interactive=neverは同じようrm -fに動作します。:詳細についてはこちらをご覧くださいunix.stackexchange.com/questions/72864/...
lesmana

回答:


282

この-fオプションは間違いなくあなたが使いたいものです。

それが参照するファイル許可に関する確認はこれです:

$ touch myfile    
$ chmod 400 myfile
$ rm myfile       
rm: remove write-protected regular empty file `myfile'?

だから、rmあなたは上の書き込み権限を持っていないファイルを削除しようとすると警告が表示されます。これは、ディレクトリに対する書き込み権限を持っている場合でも許可されますが、少し奇妙です。そのため、rm通常は警告が表示されます。


1
ほとんどのシステムではなく、すべてのシステムが尋ねます(私は思う)。いくつかが必要です-i
DaveParillo

1
エラー終了コードではなくエラーメッセージが必要な場合は、Giel Berkersの回答を参照してください。set -eすべてのbashスクリプトで使用しているため、コマンドでエラーが発生した後にスクリプトが終了します。rmエラーが発生したかどうかをスクリプトに通知することがよくありますが、続行します。続きます。
クレドゥ

124

別の解決策はこれです:https : //stackoverflow.com/questions/11231937/bash-ignoring-error-for-a-particular-command

コマンドの後にORステートメントを追加するだけです。

rm -rf my/dir || true

このようにして、ステートメント#1が失敗した(エラーをスローする)場合、ステートメント#2を実行しtrueます。


4
エラーを出力し、実行を継続します。これは私の場合に必要でした。
-worldsayshi

9
またはrm -rf my/dir ||:さらに簡潔にするために(:true
ゴッドスミス

私の意見ではより良い解決策です。何が起こっているのか、結果コードが無視される理由は簡単にわかります。私はそれが好きです!
マヴァマーテン

76

私はパーティーにかなり遅れていますが、私はいつもこれを使用しています。メイクファイルで-は、行の先頭に追加して、その行の戻り値を無視します。そのようです:

-rm lexer.ml interpparse.ml interpparse.mli

9
ただし、これはコンソールにエラーを出力します。これにより、おそらくmake出力のエラーを無視するようになります。私の意見では、rm -rfの方が良いオプションです。
ゴッドスミス

@Godsmith再帰的な削除を強制するよりもエラーを無視したいです。これは非常にいたずらかもしれません。そして、メイクファイル固有の構文のための+1
Daishi

rm -rfが「いたずら」になる可能性がある場合、バージョン管理下のディレクトリの外でmakeを使用していることを意味します。どうして?
ゴッドスミス

ドキュメントへのリンクをお願いします。この機能の説明が見つかりました。
ジョージ


14

-fオプションを使用したくない場合、代替手段は次のとおりです。

rm filethatdoesntexist 2> /dev/null 

これにより、エラーが出力されなくなります。


9
残念ながら、これでもエラー終了コードが表示されます。
ショーンマクドナルド

8

ファイル名をグロブする方法をrm見つけても、一致するものが見つからなくても文句を言うことはありません。したがってlexer.m* interpparse.*、などのようなものが機能するはずです(もちろん、削除しすぎないように注意してください)。また、-fファイルのアクセス許可によって不要なファイルを削除できないことを望んでいない限り、完全に合理的な方法です-削除したくない場合は入れないでくださいリスト内。


削除したくないlexer.mllファイルがあるので、グロビングは問題外です。-fが妥当な理由を示してくれてありがとう。1つの誤った誘導の後に私は過度に注意する傾向があると思いますsudo rm -rf
ジェイソンベイカー

さらに制限はありませんlexer.m?...?それはキャッチうlexer.mllexer.mzではなく、lexer.mlllexer.mla
JMD

1
@JMD:それはあなたのシェルと、それが提供するパターンマッチングのサポートに依存すると思います。
ニックバスティン

6

-fオプションは、何かが期待どおりでない場合にプロンプ​​トが表示されないことを意味します。許可が考慮されないという意味ではありません。

ファイルを削除するための十分な権限がない場合、ファイルは削除されません。

ただし、権限を変更するのに十分な権限がある場合、ファイルは削除されます。これは、所有者の読み取り専用権限(-r --------)を持つファイルの所有者である場合です。所有者として、を実行してchmod u+wから削除できrm -fます。そのファイルは削除されます。


5

多分次のような行を助けることができます:

touch fakefile.exe fakefile.o && rm *.o *.exe

私はこれがあまり賢くないことを知っていますが、それは仕事をします。


3

別の方法:

RmIfIsFile() {  for f in "$@"; do [ -f $f ] && rm $f; done; };  RmIfIsFile lexer.ml interpparse.ml interpparse.mli

あまりにも悪いMakefileは、シェル関数の定義を行間で共有できません。


行の最後に\(バックスラッシュ)を使用して、次の行に続けようとしましたか?
いくつかの

@some:はい、それらは複数の行に広がることができますが、レシピ間で共有するには、定義をmake変数に入れる必要があります。
reinierpost

3

これがシェルスクリプトで使用するものです。エラーメッセージとエラーコードを非表示にします。

rm doesnotexist 2> /dev/null || echo > /dev/null

方法rm doesnotexist 2&> /dev/null
user8162

1

rmする前にファイルに触れることができます。存在しない場合は作成されます:-)

touch lexer.ml interpparse.ml interpparse.mli
rm lexer.ml interpparse.ml interpparse.mli

1

書き込みrm -rf ppp>/dev/null 2>&1 エラーが2しかしSTDOUT 1をstderrにない生成した場合、あなたが新しいGETエラーメッセージの問題は、発生した...それは、コマンドがエラーが、警告ではない生成時に場所を取るのです。フィルタを設定して、このメッセージを削除する必要があります。しかし、このケースは普通です。


1

最初にファイルが存在するかどうかをテストし、存在する場合はrmに渡します。次に、rmからのエラーが意味を持ちます。-fまたはエラーメッセージを無視することは、通常、人が望むものよりも包括的です。-fは、やりたくないことをするかもしれません。

if [ -f lexer.ml ]; then
  rm lexer.ml
fi

確実に存在したいファイルがさらにある場合は、テスト句を追加します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.