web-dev-qa-db-ja.com

rmの-fオプションの本当の意味は何ですか?

GNU coreutils man page for rmを読むと、オプションの1つは-f、マニュアルによると、

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

今、私はいくつかのテストを行い、実際に私が何かのようなものを使用する場合

rm -f /nonexisting/directory/

それは文句を言わないでしょう。

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

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

 rm -rf /delete/this/dir

-rオプションは意味がありますが、-f

14
saliarosaurus

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

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

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

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

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

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

9
phunehehe

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

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

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

clean:
        rm -f *.o myapp

myappfoo.oおよびbar.oが存在する場合は削除し、存在しない場合でも問題を報告しません。

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

-iスイッチからrm

インタラクティブに-fスイッチが含まれるようにrmコマンドがエイリアスされている場合、-irmと共に使用されるのが一般的です。 -fスイッチは-iに対抗します。

rmrm -iのエイリアスとして問題をシミュレートします。

$ alias rm='rm -i'

偽のデータを作成します

$ touch afile

次に、rmのエイリアスバージョンを使用して削除してみます

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

それでは-fを使用してみてください

$ rm -f afile 
$

許可

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

3
slm