rmの-fオプションの本当のポイントは何ですか?


14

のGNU coreutilsのマニュアルページを読むrmと、オプションの1 つがになります-f。これは、マニュアルによれば、

-f, --force
          ignore nonexistent files and arguments, never prompt

今、私はいくつかのテストを行い、実際に私が

rm -f /nonexisting/directory/

文句を言うことはありません。

誰かがそのようなオプションから本当に何を得ることができますか?

さらに、「ディレクトリの削除」を使用する最も一般的な例rmは次のようなものです

 rm -rf /delete/this/dir

-rオプションでは、理にかなっている、しかし-f

回答:


9

この場合、manページには少し詳細が欠けていることがわかります。実際の-fオプションrmには、いくつかのユースケースがあります。

  • エラー終了コードを回避するには
  • プロンプトが出されないようにするには
  • 権限チェックをバイパスするには

存在しないファイルを削除するのは無意味であることは正しいですが、スクリプトでは、「これらのファイルは必要ないので、見つかった場合は削除します。 「存在しない」。一部の人々はset -eスクリプトでを使用して、エラーで停止するようにし(スクリプトが引き起こす可能性のあるさらなる損傷を回避するため)、rm -rf /home/my/garbageより簡単ですif [[ -f /home/my/garbage ]]; then rm -r /home/my/garbage; fi

権限チェックに関する注意:ファイルを削除するには、ファイル自体ではなく、ディレクトリへの書き込み権限が必要です。だから、どういうわけかrootあなたのホームディレクトリに所有されているファイルがありsudo、あなたがアクセス権を持っていない場合でも、-fオプションを使用してファイルを削除することができます。Gitを使用している場合、Gitが作成するオブジェクトファイルへの書き込み許可を残していないことがわかります。

-r--r--r-- 1 phunehehe phunehehe 62 Aug 31 15:08 testdir/.git/objects/7e/70e8a2a874283163c63d61900b8ba173e5a83c

したがって、使用する場合、使用rmせずにGitリポジトリを削除する唯一の方法rootはを使用することrm -rfです。


4
-fエラー終了コードを回避しません。rm既存のファイルを削除しようとして失敗した場合、エラーコードが返されます。
ジル「SO-悪であるのをやめる」

「エラー終了コードを回避するには」は「ファイルオペランドが存在しないか、ファイルオペランドが存在しない場合にエラー終了コードを回避するには」と記述する必要があるため、この回答を下げました。この答えは現在書かれているので、間違っています。
ハロルドフィッシャー

6

この-fオプションは、読み取り専用ファイルを削除するときの確認プロンプトを抑制します。また、1つ以上の提供されたファイルが存在しない場合のエラーも抑制します。

この-fオプションは、削除するファイルの一部が読み取り専用である可能性があることを認識していて、それについてプロンプトを表示したくない場合に役立ちます。

このfオプションは、ファイルが存在する場合にそれを削除したい場合や、ファイルが存在するかどうかを気にしたくない場合にも役立ちます。これは、ソースファイルから再生成できるファイルを削除するコマンドを作成するために、メイクファイルで非常によく使用されます。たとえば、foo.oから再構築することができfoo.cbar.oから再構築することができbar.c、及びmyappから再構築することができるfoo.obar.o、その後のmakefileターゲット

clean:
        rm -f *.o myapp

削除しmyappfoo.oそしてbar.o彼らが存在し、それらのいずれかが存在しない場合は文句を言われていない場合。

-fほとんどの場合、ディレクトリツリーを削除する手順に含める必要はありません。ディレクトリツリーの内容に関係なくそのディレクトリツリーを削除することが確実な-f場合は、一部のファイルが読み取り専用である場合にプロンプ​​トを表示しないように指定できるため、正当化できます。しかし、実行するように言う人rm -rfは、オプション-r-f実際に必要であるかどうかに関係なく、しばしば何かを取り除くために神秘的な呪文を繰り返しているだけです。オプションが必要でない場合、引数のタイプミスが重要な何かを破壊するリスクを高めるため、推奨されません。


3

への-i切り替えrm

私は通常、コマンドがエイリアス化され、インタラクティブなスイッチが含まれる場合-fに使用されることを確認しています。スイッチが対抗します。rmrm-i-f-i

rmへのエイリアスである問題をシミュレートしrm -iます。

$ alias rm='rm -i'

偽のデータを作成する

$ touch afile

ここで、エイリアスバージョンを使用して削除してみてください。 rm

$ rm afile 
rm: remove regular empty file `afile'?

今使用してみてください -f

$ rm -f afile 
$

許可

また、ディレクトリへの読み取り専用アクセス権があり、そのディレクトリ内のファイルまたはサブディレクトリを削除しようとすると、「よろしいですか?」という同様のプロンプトが表示されます。を使用-fすると、yesと言う必要がなくなります。


エイリアスを使用することで、確かに意味があります。そして、あなたの答えは、私がopenbsdのmanページに表示しているものと一致します。openbsdはGNU / Linuxではありませんが、あなたが言ったことを説明しているようです。[リンク]:誰かがチェックしたい場合はこちらのリンクですopenbsd.org/cgi-bin/...
saliarosaurus

bashを使用\rmすると、エイリアスを作成せずにいつでも実行できます(\はcommandビルドされたitのショートカットです)。最適な使用法-fは、ロックファイルなど、存在する場合と存在しない場合-fがあり、rm: cannot remove 'file': No such file or directory警告を停止するシェルスクリプトでの使用です。
Dravスローン

@DravSloanはい、それも理にかなっています。Dravスローンとslmの両方のあなたの答えをありがとう
saliarosaurus

私は使用rm -f上、多くの場合cleanでは、ターゲットMakefile
アレックス・

-i本当の意味ではありません-f、それはエッジケースのようなものです。
ジル「SO-悪であるのをやめる」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.