web-dev-qa-db-ja.com

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

私はコンパイルの終わりにいくつかの無駄なファイルを片付けるmakefileを書いています。ターゲットがすでに作成されている場合は、もちろんそのターゲットはスキップされ、無駄なファイルが存在しない可能性があります。だから私はこれをすれば:

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.

ほとんど欲しいもののように聞こえますが、パーミッションの部分についてはよくわかりません。これを行う方法はありますか?

311
Jason Baker

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

それが言及するファイル許可についての確認はこれです:

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

書き込み権限がないファイルを削除しようとすると、rmname__が警告を出します。ディレクトリへの書き込み権限があっても少し変わっている場合、これは許可されているので、rmname__は通常それについて警告します。

270
Dave Webb

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

コマンドの後にOR文を追加するだけです。

rm -rf my/dir || true

このようにして、ステートメント#1が失敗すると(エラーがスローされると)、ステートメント#2を実行します。これは単にtrueです。

111
Giel Berkers

パーティーには遅すぎるけど、いつもこれを使っている。メイクファイルでは、行の戻り値を無視するために行の先頭に-を追加します。そのようです:

-rm lexer.ml interpparse.ml interpparse.mli
75
Robert Li

-fオプションを使用したくない場合は、次の方法があります。

rm filethatdoesntexist 2> /dev/null 

これはエラーが印刷されないようにするだけです。

13
user135299

ファイル名をグロブ グロブ する方法が見つかった場合、rmは、一致するものが見つからないと文句を言いません。それで、lexer.m* interpparse.*などのようなものがあなたのために働くべきです(もちろん、あなたがあまりに多くを削除しないように注意してください)。また、-fは、ファイルのパーミッションが不要なファイルの削除からあなたを救うことを望んでいない限り、完全に合理的な方法です。削除したくない場合は、入れないでください。リストにそれがあります。

8
Nick Bastin

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

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

BUT、あなたが特権を変更するのに十分な特権を持っている場合、あなたのファイルは削除されます。これは、あなたが所有者に対して読み取り専用の許可を持つファイルの所有者である場合です(-r --------)。所有者として、あなたはそれを削除することができますchmod u+wrm -fはそのファイルを削除します。

6
mouviciel

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

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

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

4
Bogdan

代替案

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

あまりにも悪いMakefileは、行を越えてShell関数定義を共有することができません。

3
reinierpost

これが私がシェルスクリプトで使っていることです。エラーメッセージとエラーコードを隠します。

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

write rm -rf ppp>/dev/null 2>&1 youer get error message問題が発生するのは、STDERR 2ではなくSTDOUT 1にエラーが生成される場合です...コマンドはエラーではなく警告を生成するときに発生します。フィルタを設定して、このメッセージを削除する必要があります。しかし、このケースは普通です。

1
Anatoly

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

touch lexer.ml interpparse.ml interpparse.mli
rm lexer.ml interpparse.ml interpparse.mli
1
commonpike

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

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

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

1
user244488