shell – ファイルが存在しない場合に rm がエラーを出さないようにするには?

makefile rm shell

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

rm lexer.ml interpparse.ml interpparse.mli

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

マンページを読んでいると、以下のような選択肢が出てきます

 -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.

それは私が望んでいることのように聞こえますが、パーミッションの部分については本当によくわかりません。何か方法はありますか?

  391  Jason Baker  2009-11-27


ベストアンサー

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

参照しているファイルのパーミッションについての確認はこれです

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

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

332  Dave Webb  2009-11-27


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

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

rm -rf my/dir || true

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

161  Giel Berkers  2015-03-09


遅ればせながら、いつもこれを使っています。makefile で、行頭に - をつけると、その行の戻り値を無視します。こんな感じ

-rm lexer.ml interpparse.ml interpparse.mli

82  Robert Li  2012-12-23


もし -f オプションを使いたくない場合は、代替案があります

rm filethatdoesntexist 2> /dev/null || true

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

17  user135299  2012-06-12


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

8  Nick Bastin  2009-11-27


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

ファイルを削除する権限が足りない場合は削除されません

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

6  mouviciel  2009-11-27


たぶん、似たようなラインを助けることができます

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

これはあまりスマートではないと思いますが、仕事はしてくれます

5  Bogdan  2011-03-11


An alternative:

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

Makefile はシェル関数の定義を行をまたいで共有できないのが残念です

3  reinierpost  2009-11-27


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

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

3  teh_senaus  2015-06-11


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

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

より多くのファイルが存在することを確認したい場合は、より多くのテスト条項を追加します

2  None  2018-10-09


rmする前にファイルを触ることができます。)

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

1  commonpike  2017-02-02


write rm -rf ppp>/dev/null 2>&1 を実行するとエラーが出る 問題は、STDERR 2ではなくSTDOUT 1にエラーが発生した場合に発生します。エラーではなく警告が出る場合に発生します。フィルタを設定して、このメッセージを削除する必要があります。しかし、このようなケースは普通にあります

1  Anatoly  2017-08-19


タイトルとURLをコピーしました