¿Cuál es la diferencia entre rm -r y rm -f?

¿Cuál es la diferencia entre rm -r y rm -f?

Del manual:

  • -f, --fuerza

    ignorar archivos inexistentes, nunca preguntar

  • -r, -R, --recursivo

    eliminar el contenido de los directorios de forma recursiva

Aunque la descripción de esta opción es diferente, al intentar eliminar una carpeta vacía (sin rmdir para este ejemplo) se obtiene el mismo resultado.

-fno imprime error ni nada en comparación con -r, ¿es esta la única diferencia o hay un tipo específico de situaciones en las que una opción es mejor que otra o situaciones en las que una de estas opciones simplemente no funcionará mientras que la otra sí?

Respuesta1

Esto es lo que dice la página de manual en CentOS:

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

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

Por lo que he recopilado (gracias a algunos comentarios a continuación), lo siguiente es cierto para las banderas -ry -f:

-r

  • elimina recursivamente el contenido de un directorio, incluidos archivos y subdirectorios ocultos
  • Dependiendo de su configuración, puede solicitar permiso (por ejemplo, al usar la --interactivebandera). Algunas distribuciones hacen esto de forma predeterminada.
  • se puede utilizar para eliminar un directorio, si desea hacerlo, simplemente proporcione la ruta del directorio (por ejemplo /path/to/directory:)

-F

  • no elimina recursivamente el contenido de un directorio, solo elimina archivos que coinciden directamente con la ruta dada (por ejemplo example/file1o example/*).
  • Nunca elimina subdirectorios
  • Nunca pide permiso, básicamente yes to allen Windows.

A continuación se muestran algunos ejemplos, todos ellos comienzan con la siguiente estructura:

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

Habilité el modo detallado y interactivo de forma predeterminada para estos ejemplos. Algunas distribuciones hacen esto mientras que otras no.

ejemplo de rm

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

Como puede ver, rmno elimina directorios de forma predeterminada.

ejemplo rm -f

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

El uso de la -fbandera todavía no le permite eliminar directorios.

ejemplo 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'

Como puede ver, se le solicita permiso para cada archivo y directorio; los archivos ocultos también se eliminan.

ejemplo rm/* -f

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

Aquí no se le pide permiso, no se eliminan directorios ni archivos ocultos.

ejemplo 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'

Aquí, se elimina el contenido del directorio de ejemplo (no el directorio en sí), incluidos los archivos ocultos.

Respuesta2

rm -r mydireliminará el mydirdirectorio con todo su contenido.

rm -f mydirno eliminará un directorio (ni vacío ni con contenido). Informará un error:

  • en BSD/OS X:

    rm: mydir/: is a directory
    
  • en GNU/Linux:

    rm: cannot remove 'mydir': Is a directory
    

Posibles explicaciones para que el rmcomando se comporte independientemente de los argumentos dados (del más al menos probable):

  1. tienes un alias de shell rmdefinido y pasa algunos parámetros definidos (como -r) al rmcomando
  2. está llamando a un script llamado rmque también pasa parámetros adicionales al comando real
  3. tienes un rmejecutable personalizado

Puedes verificar las dos primeras posibilidades ejecutando /bin/rm -f mydir.

información relacionada