rm -r と rm -f の違いは何ですか?

rm -r と rm -f の違いは何ですか?

マニュアルより:

  • -f、--force は、

    存在しないファイルを無視し、プロンプトを表示しない

  • -r、-R、--再帰

    ディレクトリの内容を再帰的に削除する

このオプションの説明は異なりますが、空のフォルダーを削除しようとすると (この例では rmdir なし)、同じ結果になります。

-fと比較して、エラーなどは印刷されません。-rこれが唯一の違いですか、それとも、一方のオプションが他方のオプションよりも優れている特定の状況、またはこのオプションの 1 つが単に機能せず、もう一方のオプションが機能する状況があるのでしょうか。

答え1

CentOS のマニュアルページには次のように書かれています:

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

-r, -R, --recursive
    remove directories and their contents recursively

私が収集した情報 (以下のコメントによる) によると、-rおよび-fフラグについては次のことが当てはまります。

-r

  • 隠しファイルやサブディレクトリを含むディレクトリの内容を再帰的に削除します。
  • 設定によっては、許可を求められる場合があります (たとえば、フラグを使用する場合--interactive)。一部のディストリビューションでは、これがデフォルトで行われます。
  • ディレクトリを削除するために使用できます。削除する場合は、ディレクトリのパスを指定するだけです (例: /path/to/directory)

-f

  • ディレクトリの内容を再帰的に削除するのではなく、指定されたパスに直接一致するファイルのみを削除します (たとえば、example/file1またはexample/*)。
  • サブディレクトリを削除しない
  • yes to all基本的にWindowsでは許可を求めません

以下にいくつかの例を示します。いずれも次の構造で始まります。

example/
  file1
  file2
  file3
  .file
  dir/
    file1
    file2
    file3
    .file

これらの例では、詳細モードと対話モードをデフォルトで有効にしました。ディストリビューションによってはこれを実行するものもあれば、実行しないものもあります。

rmの例

$ rm example
rm: cannot remove `example': Is a directory

ご覧のとおり、rmデフォルトではディレクトリは削除されません。

rm 例 -f

$ rm example -f
rm: cannot remove `example': Is a directory

フラグを使用して-fも、ディレクトリを削除することはできません。

rm 例 -r

$ rm example -r
rm: descend into directory `example'? yes
rm: remove regular empty file `example/file3'? yes
  removed `example/file3'
rm: remove regular empty file `example/file2'? yes
  removed `example/file2'
rm: descend into directory `example/dir'? yes
rm: remove regular empty file `example/dir/.file'? yes
  removed `example/dir/.file'
rm: remove regular empty file `example/dir/file3'? yes
  removed `example/dir/file3'
rm: remove regular empty file `example/dir/file2'? yes
  removed `example/dir/file2'
rm: remove regular empty file `example/dir/file1'? yes
  removed `example/dir/file1'
rm: remove directory `example/dir'? yes
  removed directory: `example/dir'
rm: remove regular empty file `example/file1'? yes
  removed `example/file1'
rm: remove directory `example'? yes
  removed directory: `example'

ご覧のとおり、すべてのファイルとディレクトリに対して許可が求められ、隠しファイルも削除されます。

rm 例/* -f

$ rm example/* -f
rm: cannot remove `example/dir': Is a directory
removed `example/file1'
removed `example/file2'
removed `example/file3'

ここでは、許可は求められず、ディレクトリは削除されず、隠しファイルも削除されません。

rm 例/* -r

$ rm example/* -r
rm: descend into directory `example/dir'? yes
rm: remove regular empty file `example/dir/.file'? yes
  removed `example/dir/.file'
rm: remove regular empty file `example/dir/file3'? yes
  removed `example/dir/file3'
rm: remove regular empty file `example/dir/file2'? yes
  removed `example/dir/file2'
rm: remove regular empty file `example/dir/file1'? yes
  removed `example/dir/file1'
rm: remove directory `example/dir'? yes
  removed directory: `example/dir'
rm: remove regular empty file `example/.file'? yes
  removed `example/file'
rm: remove regular empty file `example/file1'? yes
  removed `example/file1'
rm: remove regular empty file `example/file2'? yes
  removed `example/file2'
rm: remove regular empty file `example/file3'? yes
  removed `example/file3'

ここでは、隠しファイルを含む、サンプル ディレクトリの内容 (ディレクトリ自体ではありません) が削除されます。

答え2

rm -r mydirディレクトリとそのすべての内容を削除しますmydir

rm -f mydirディレクトリ(空でも中身がなくても)は削除されません。エラーが報告されます:

  • BSD/OS Xの場合:

    rm: mydir/: is a directory
    
  • GNU/Linuxの場合:

    rm: cannot remove 'mydir': Is a directory
    

指定された引数に関係なくコマンドが動作する理由として考えられるものrm(最も可能性の高いものから最も可能性の低いものまで):

  1. シェルエイリアスがrm定義されており、いくつかの定義済みパラメータ(など-r)がrmコマンドに渡されます
  2. というスクリプトを呼び出していますがrm、このスクリプトは実際のコマンドに追加のパラメータも渡します。
  3. rmカスタム実行ファイルがある

最初の 2 つの可能性は、 を実行することで確認できます/bin/rm -f mydir

関連情報