2009-11-27 16:43:23 +0000 2009-11-27 16:43:23 +0000
347
347

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

コンパイルの最後に無駄なファイルをクリーンアップするための makefile を書いていますが、すでにターゲットが作られている場合は、もちろんそのターゲットをスキップして、無駄なファイルは存在しないかもしれません。すでにターゲットが作られている場合、もちろんそのターゲットはスキップされ、無駄なファイルはそこにはないかもしれません。そのため、

rm lexer.ml interpparse.ml interpparse.mli

を実行すると、ファイルが存在しないためにエラーが発生する可能性があります。これらのファイルを無視するように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.

それは私が望むもののようにalmost聞こえるが、私は実際に権限の部分についてはよくわからない。これを行う方法はありますか?

回答 (11)

296
296
296
2009-11-27 16:54:52 +0000

それが参照しているファイルパーミッションについての確認は以下の通りです:

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

だから -f は、書き込み権限のないファイルを削除しようとすると警告します。これはディレクトリに書き込み権限がある場合には許可されていますが、ちょっと変なので、通常はrmが警告を出します。

132
132
132
2015-03-09 12:39:25 +0000

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

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

rm -rf my/dir || true

この方法では、ステートメント #1 が失敗したとき (エラーを投げるとき)、ステートメント #2 を実行します。

79
79
79
2012-12-23 23:12:06 +0000

遅ればせながら、いつもこれを使っています。makefile で、行の先頭に - を追加すると、その行の戻り値を無視します。このようにします:

-rm lexer.ml interpparse.ml interpparse.mli
14
14
14
2012-06-12 19:46:48 +0000

f オプションを使いたくない場合は、次のようにしてください:

rm filethatdoesntexist 2> /dev/null

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

8
8
8
2009-11-27 16:48:43 +0000

ファイル名を glob にする何らかの方法を見つけたとしても、rm は一致するものが見つからなくても文句を言わない。ですから、lexer.m* interpparse.* などのようなものがあなたのために働くはずです(もちろん、削除しすぎないように注意してください)。また、-f は完全に合理的な方法であり、ファイルパーミッションがあなたが削除したくないファイルを削除しないようにしてくれることを期待していない限り - 削除したくないのであれば、リストに入れないでください。

6
6
6
2009-11-27 19:27:29 +0000

f オプションは、何かが期待通りでない場合にプロンプトが表示されないことを意味します。これは、パーミッションが考慮されないことを意味しません。

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

5
5
5
2011-03-11 10:36:07 +0000

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

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

私はこれが非常にスマートではないことを知っていますが、それは仕事をします。

3
3
3
2015-06-11 13:55:15 +0000

シェルスクリプトで使っているものはこんな感じです。エラーメッセージとエラーコードを非表示にします。

rm doesnotexist 2> /dev/null || echo > /dev/null
3
3
3
2009-11-27 17:44:12 +0000

代替案:

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

残念ながら Makefile はシェル関数の定義を行をまたいで共有することができません。

1
1
1
2017-02-02 16:11:37 +0000

rmする前にファイルをタッチすることができます。

1
1
1
2017-08-19 09:47:36 +0000

書き込み rm -rf ppp>/dev/null 2>&1you newer get error message エラーメッセージが出る 問題は、STDERR2ではなくSTDOUT1にエラーが発生した場合に発生します。エラーではなく警告が出る場合に発生します。フィルタを設定して、このメッセージを削除する必要があります。しかし、このようなケースは普通にあります。

関連する質問

6
10
11
37
6