私はコンパイルの終わりにいくつかの無駄なファイルを片付ける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.
ほとんど欲しいもののように聞こえますが、パーミッションの部分についてはよくわかりません。これを行う方法はありますか?
-f
オプションは間違いなくあなたが使いたいものです。
それが言及するファイル許可についての確認はこれです:
$ touch myfile
$ chmod 400 myfile
$ rm myfile
rm: remove write-protected regular empty file `myfile'?
書き込み権限がないファイルを削除しようとすると、rm
name__が警告を出します。ディレクトリへの書き込み権限があっても少し変わっている場合、これは許可されているので、rm
name__は通常それについて警告します。
別の解決策はこれです: https://stackoverflow.com/questions/11231937/bash-ignoring-error-for-a-particular-command
コマンドの後にOR文を追加するだけです。
rm -rf my/dir || true
このようにして、ステートメント#1が失敗すると(エラーがスローされると)、ステートメント#2を実行します。これは単にtrue
です。
パーティーには遅すぎるけど、いつもこれを使っている。メイクファイルでは、行の戻り値を無視するために行の先頭に-
を追加します。そのようです:
-rm lexer.ml interpparse.ml interpparse.mli
-fオプションを使用したくない場合は、次の方法があります。
rm filethatdoesntexist 2> /dev/null
これはエラーが印刷されないようにするだけです。
ファイル名をグロブ グロブ する方法が見つかった場合、rm
は、一致するものが見つからないと文句を言いません。それで、lexer.m* interpparse.*
などのようなものがあなたのために働くべきです(もちろん、あなたがあまりに多くを削除しないように注意してください)。また、-f
は、ファイルのパーミッションが不要なファイルの削除からあなたを救うことを望んでいない限り、完全に合理的な方法です。削除したくない場合は、入れないでください。リストにそれがあります。
-fオプションは、何かが予想通りでない場合はプロンプトが表示されないことを意味します。許可が考慮されないという意味ではありません。
ファイルを削除するための十分な特権がない場合、そのファイルは削除されません。
BUT、あなたが特権を変更するのに十分な特権を持っている場合、あなたのファイルは削除されます。これは、あなたが所有者に対して読み取り専用の許可を持つファイルの所有者である場合です(-r --------)。所有者として、あなたはそれを削除することができますchmod u+w
:rm -f
はそのファイルを削除します。
多分次のような行を手助けすることができます。
touch fakefile.exe fakefile.o && rm *.o *.exe
これはあまり賢くないことを私は知っていますが、それは仕事をします。
代替案
RmIfIsFile() { for f in "$@"; do [ -f $f ] && rm $f; done; }; RmIfIsFile lexer.ml interpparse.ml interpparse.mli
あまりにも悪いMakefileは、行を越えてShell関数定義を共有することができません。
これが私がシェルスクリプトで使っていることです。エラーメッセージとエラーコードを隠します。
rm doesnotexist 2> /dev/null || echo > /dev/null
write rm -rf ppp>/dev/null 2>&1
youer get error message問題が発生するのは、STDERR 2ではなくSTDOUT 1にエラーが生成される場合です...コマンドはエラーではなく警告を生成するときに発生します。フィルタを設定して、このメッセージを削除する必要があります。しかし、このケースは普通です。
あなたがそれらをrmする前にあなたはファイルに触れることができます。それらが存在しない場合、それはそれらを作成します:-)
touch lexer.ml interpparse.ml interpparse.mli
rm lexer.ml interpparse.ml interpparse.mli
ファイルが最初に存在するかどうかをテストし、存在する場合は、それをrmに渡します。それからrmからのエラーは意味があります。 -fまたはエラーメッセージを無視することは通常、人が望んでいることよりも包括的です。 -fあなたがしたくないことをするかもしれません。
if [ -f lexer.ml ]; then
rm lexer.ml
fi
確実に存在させたいファイルがさらにある場合は、テスト句をさらに追加してください。