rm (Unix)

Utilidad de comandos de Unix
Escorpión
Autor(es) original(es)Ken Thompson , Dennis Ritchie
( Laboratorios Bell de AT&T )
Desarrollador(es)Varios desarrolladores comerciales y de código abierto
Lanzamiento inicial3 de noviembre de 1971 ; hace 53 años ( 03-11-1971 )
Escrito endo
Sistema operativoUnix , similar a Unix , V , Plan 9 , Inferno , KolibriOS , IBM i
PlataformaMultiplataforma
TipoDominio
Licenciacoreutils : GPLv3+
Plan 9: Licencia MIT

rm(abreviatura de remove ) es un comando básico en sistemas operativos Unix y similares que se utiliza para eliminar objetos como archivos de computadora , directorios y enlaces simbólicos de los sistemas de archivos y también archivos especiales como nodos de dispositivos , tuberías y sockets , similar al comando en MS-DOS , OS/2 y Microsoft Windows . El comando también está disponible en el shell EFI . [1]del

Descripción general

El rmcomando elimina referencias a objetos del sistema de archivos mediante la llamada al sistema unlink , donde esos objetos pueden haber tenido múltiples referencias (por ejemplo, un archivo con dos nombres diferentes), y los objetos mismos se descartan solo cuando se han eliminado todas las referencias y ningún programa todavía tiene identificadores abiertos para los objetos.

Esto permite escenarios en los que un programa puede abrir un archivo, eliminarlo inmediatamente del sistema de archivos y luego usarlo como espacio temporal, sabiendo que el espacio del archivo se recuperará después de que el programa salga, incluso si sale fallando.

El comando generalmente no destruye los datos del archivo, ya que su propósito es simplemente desvincular referencias, y el espacio del sistema de archivos liberado puede contener aún datos sobrantes del archivo eliminado. Esto puede ser un problema de seguridad en algunos casos, y las versiones reforzadas a veces permiten borrar los datos cuando se corta el último vínculo, y hay programas como shred y srm que brindan específicamente la capacidad de borrar datos.

rmGeneralmente solo se ve en sistemas operativos derivados de UNIX , que normalmente no permiten la recuperación de archivos eliminados a través de un mecanismo como la papelera de reciclaje , [2] de ahí la tendencia de los usuarios a encerrarlos rmen algún tipo de contenedor para limitar la eliminación accidental de archivos.

Existen utilidades de recuperación que intentarán reconstruir el índice y pueden recuperar el archivo si las partes no se reutilizaron.

Historia

En algunas versiones antiguas de Unix, el rmcomando eliminaría directorios si estuvieran vacíos. [3] Este comportamiento aún se puede obtener en algunas versiones de rmcon el -dindicador, por ejemplo, los BSD (como FreeBSD , [4] NetBSD , [5] OpenBSD [6] y macOS ) derivados de 4.4BSD-Lite2.

La versión rmincluida en GNU coreutils fue escrita por Paul Rubin, David MacKenzie, Richard Stallman y Jim Meyering. [7] Esta versión también proporciona -duna opción para ayudar con la compatibilidad. [8] El comando estándar proporciona la misma funcionalidad rmdir.

La -iopción de la versión 7 reemplazó a , o "eliminar de los dswconmutadores", que debutó en la versión 1. Doug McIlroy escribió que dsw"era una herramienta desesperada diseñada para limpiar archivos con nombres impronunciables". [9]

El comando está disponible como un paquete separado para Microsoft Windows como parte de la colección UnxUtils de puertos Win32 nativos de utilidades comunes de tipo Unix de GNU. [10] KolibriOS incluye una implementación del comando. [11] El comando rm también ha sido portado al sistema operativo IBM i . [12] rm

Sintaxis

rmelimina el archivo especificado después de agregar las opciones. Los usuarios pueden usar una ruta completa o una ruta de archivo relativa para especificar los archivos que se eliminarán. rmNo elimina un directorio de manera predeterminada. [13]rm foo elimina el archivo " foo " en el directorio en el que se encuentra actualmente el usuario.

rm, al igual que otros comandos, utiliza opciones para especificar cómo se comportará:

  • -r, "recursivo", que elimina directorios, eliminando el contenido recursivamente de antemano (para no dejar archivos sin un directorio donde residir).
  • -i, "interactivo" que pide que se confirme cada eliminación.
  • -f, "fuerza", que ignora los archivos inexistentes y anula cualquier solicitud de confirmación (cancelando efectivamente -i), aunque no eliminará archivos de un directorio si el directorio está protegido contra escritura.
  • -v, "verbose", que imprime lo que rmestá haciendo en la terminal
  • -d, "directorio", que elimina un directorio vacío y solo funciona si el directorio especificado está vacío.
  • --one-file-system, solo elimina archivos en el mismo sistema de archivos que el argumento e ignorará los sistemas de archivos montados.

rmPuede superponerse con una función de alias de shell ( alias de shell C , Bourne shell o Bash) de " " para evitar la eliminación accidental de archivos. Si un usuario aún desea eliminar una gran cantidad de archivos sin confirmación, puede cancelar manualmente el argumento agregando la opción (ya que la opción especificada más adelante en la línea de comando expandida " " tiene prioridad). Desafortunadamente, este enfoque genera hábitos peligrosos hacia el uso de comodines, lo que lleva a su propia versión de eliminaciones accidentales.rm -i-i-frm -i -f

rm -rf(de forma variada, rm -rf /, rm -rf *, y otros) se utiliza con frecuencia en chistes y anécdotas sobre desastres de Unix, [14] como la pérdida de muchos archivos durante la producción de la película Toy Story 2 en Pixar . [15] La rm -rf /variante del comando, si la ejecuta un superusuario , haría que todos los archivos accesibles desde el sistema de archivos actual se eliminen de la máquina.

rmse utiliza a menudo junto con xargs para proporcionar una lista de archivos a eliminar:

 xargs  rm  <  lista de archivos

O bien, para eliminar todas las imágenes PNG en todos los directorios debajo del actual:

 buscar  .  -nombre '*.png' -exec rm {} +     

Permisos

Por lo general, en la mayoría de los sistemas de archivos, para borrar un archivo se requiere permiso de escritura en el directorio padre (y permiso de ejecución, para poder ingresar al directorio en primer lugar). (Tenga en cuenta que, para confusión de los principiantes, los permisos en el archivo en sí son irrelevantes. Sin embargo, GNU rmsolicita confirmación si se va a borrar un archivo protegido contra escritura, a menos que se use la opción -f). [16]

Para eliminar un directorio (con rm -r), uno debe eliminar todo su contenido recursivamente. Esto requiere que uno deba tener permiso de lectura, escritura y ejecución para ese directorio (si no está vacío) y todos los subdirectorios no vacíos recursivamente (si hay alguno). Los permisos de lectura son necesarios para listar el contenido del directorio con el fin de eliminarlo. Esto a veces conduce a una situación extraña donde un directorio no vacío no se puede eliminar porque uno no tiene permiso de escritura en él y por lo tanto no puede eliminar su contenido; pero si el mismo directorio estuviera vacío, uno podría eliminarlo. [17]

Si un archivo reside en un directorio con el bit persistente activado, entonces para eliminar el archivo es necesario ser el propietario del archivo.

Protección de la raíz del sistema de archivos

Sun Microsystems introdujo rm -rf /la protección " " en Solaris 10, lanzado por primera vez en 2005. Al ejecutar el comando, el sistema informa ahora que no se permite la eliminación de /. [18] Poco después, se introdujo la misma funcionalidad en la versión FreeBSD de rmla utilidad. [19] GNU rm se niega a ejecutar si se proporciona rm -rf /la opción, [20] que ha sido la opción predeterminada desde que se lanzó la versión 6.4 de GNU Core Utilities en 2006. En los sistemas más nuevos, este mecanismo de seguridad siempre está activo, incluso sin la opción. Para ejecutar el comando, el usuario debe omitir el mecanismo de seguridad agregando la opción , incluso si es el superusuario.--preserve-root--no-preserve-root

A prueba de usuarios

Los administradores de sistemas, diseñadores e incluso los usuarios a menudo intentan defenderse contra la eliminación accidental de archivos creando un alias o una función como la siguiente:

alias rm = "rm -i"
rm () { /bin/rm -i " $@ " ; }        

Esto hace que rmse le pida al usuario que confirme archivo por archivo si debe eliminarse, presionando la tecla Y o N. Desafortunadamente, esto tiende a entrenar a los usuarios para que sean descuidados con los comodines que usan en sus rmcomandos, además de fomentar una tendencia a presionar alternativamente la tecla de inicio yy la tecla de retorno para confirmar las eliminaciones, hasta justo después del archivo que necesitaban conservar. [ cita requerida ] Se ha visto a usuarios incluso llegar al punto de insertar automáticamente una "y" para cada archivo. [ cita requerida ]yes | rm files

Un compromiso que permite a los usuarios confirmar solo una vez, fomenta el uso adecuado de comodines y facilita la verificación de la lista se puede lograr con algo como:

si [ -n " ​​$PS1 " ] ; entonces rm () { ls -FCsd " $@ " echo 'eliminar[ny]? ' | tr -d '\012' ; leer si [ "_ $REPLY " = "_y" ] ; entonces /bin/rm -rf " $@ " de lo contrario echo '(cancelado)' fi } fi                                     

Es importante tener en cuenta que esta función no debe convertirse en un script de shell, ya que se correría el riesgo de que se encuentre antes que el sistema rmen la ruta de búsqueda, ni debe permitirse en shells no interactivos donde podría interrumpir los trabajos por lotes. Incluir la definición en la if [ -n "$PS1" ] ; then ....  ; ficonstrucción protege contra esto último.

Existen alternativas de terceros que evitan la eliminación accidental de archivos importantes, como “safe-rm” [21] o “trash”. [22]

Limitación máxima de argumentos en la línea de comandos

La implementación de GNU Core Utilities utilizada en múltiples distribuciones de Linux estará limitada en el número de bytes de argumentos de línea de comandos que se asignan dentro del núcleo para argumentos de línea de comandos antes del núcleo 2.6.23 publicado el 9 de octubre de 2007 [23] [24] que se definieron en el momento de compilación del núcleo en una variable MAX_ARG_PAGESen include/linux/binfmts.hel archivo, pero los nuevos núcleos limitan la longitud máxima de argumentos al 25% del límite máximo de pila (ulimit -s). Error: /bin/rm: Argument list too long.se solicitará un aviso si se excede el límite de argumentos de línea de comandos [25]

Véase también

Referencias

  1. ^ "EFI Shells and Scripting" (Conchas y secuencias de comandos EFI). Intel . Consultado el 25 de septiembre de 2013 .
  2. ^ "Unix - Preguntas frecuentes (3/7) [Publicaciones frecuentes]Sección - ¿Cómo puedo "recuperar" un archivo?". www.faqs.org .
  3. ^ "Página rm de la Sección 1 del manual de Unix 8.º". man.cat-v.org .
  4. ^ "RM(1)", FreeBSD-5.4-RELEASE , consultado el 5 de febrero de 2015
  5. ^ "RM(1)", NetBSD-2.0 , consultado el 5 de febrero de 2015
  6. ^ "RM(1)", OpenBSD-3.6 , consultado el 5 de febrero de 2015
  7. ^ "rm(1): eliminar archivos/directorios - Página del manual de Linux". linux.die.net .
  8. ^ Krzysztof Goj (22 de enero de 2012). "rm: nueva opción --dir (-d) para eliminar directorios vacíos". coreutils.git .
  9. ^ McIlroy, MD (1987). Un lector de Unix para investigación: extractos anotados del Manual del programador, 1971–1986 (PDF) (Informe técnico). CSTR. Bell Labs. 139.
  10. ^ "Puertos Win32 nativos de algunas utilidades GNU". unxutils.sourceforge.net .
  11. ^ "Shell - Wiki de KolibriOS". wiki.kolibrios.org .
  12. ^ IBM . "Programación Qshell para IBM System i versión 7.2" (PDF) . IBM . Consultado el 5 de septiembre de 2020 .
  13. ^ "rm(1) - Página del manual de Linux". man7.org .
  14. ^ Gite, Vivek. «Linux/UNIX: Eliminar un archivo». Nixcraft . Consultado el 24 de noviembre de 2011 .
  15. ^ Panzarino, Matthew (21 de mayo de 2012). "Cómo Toy Story 2 fue eliminada dos veces, una por accidente y otra a propósito". TNW | Medios . Consultado el 27 de septiembre de 2022 .
  16. ^ "Ayuda y ejemplos del comando rm de Linux". ComputerHope . 24 de enero de 2018. Archivado desde el original el 16 de abril de 2016 . Consultado el 24 de enero de 2019 .{{cite news}}: CS1 maint: URL no apta ( enlace )
  17. ^ McElhearn, Kirk (2 de enero de 2014). «Domine la línea de comandos: eliminar archivos y carpetas». Macworld . Consultado el 24 de enero de 2019 .
  18. ^ "Intromisión en los asuntos de los magos". Archivado desde el original el 3 de noviembre de 2016.
  19. ^ "La confirmación anterior agregó código a rm(1) para advertir y eliminar cualquier · freebsd/freebsd@d6b7bd9". GitHub .
  20. ^ "invocación de rm (GNU Coreutils)". www.gnu.org .
  21. ^ "Safe-rm en Launchpad". Launchpad .
  22. ^ "andreafrancia/trash-cli". 12 de septiembre de 2020 – vía GitHub.
  23. ^ "Linux_2_6_23 - Principiantes del kernel de Linux". kernelnewbies.org .
  24. ^ "kernel/git/torvalds/linux.git - Árbol de código fuente del kernel de Linux". git.kernel.org .
  25. ^ ""Lista de argumentos demasiado larga": Más allá de argumentos y limitaciones | Linux Journal". www.linuxjournal.com .

Lectura adicional

Obtenido de "https://es.wikipedia.org/w/index.php?title=Rm_(Unix)&oldid=1167035332"