コンパイルの最後に無駄なファイルをクリーンアップするための 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