rm` remove` , abreviatura de ` remove` , es un comando de shell para eliminar archivos (incluidos archivos especiales como directorios ) del sistema de archivos . El comando puede no eliminar realmente un archivo (liberar su espacio de almacenamiento para su reutilización) ya que solo lo desvincula , eliminando un enlace físico a un archivo mediante la llamada al sistema `remove` . Si un archivo tiene varios enlaces y no se eliminan todos, el archivo permanece en el sistema de archivos; accesible a través de sus otros enlaces. Cuando se elimina el único enlace de un archivo, este se elimina , liberando su espacio de almacenamiento para otro uso.unlink()
Por lo general, el espacio de almacenamiento que ocupaba un archivo eliminado aún conserva sus datos hasta que se sobrescribe con el contenido de otro archivo. Estos datos no son accesibles mediante las operaciones de archivo habituales, pero pueden recuperarse con herramientas especializadas. Dado que esto se considera un riesgo de seguridad en algunos contextos, una versión reforzada de la herramienta cppuede borrar el área de almacenamiento del archivo al eliminarlo. Comandos como `shred` y `srm` permiten borrar datos de forma precisa.
Dado que rmno proporciona una alternativa para recuperar un archivo como la papelera de reciclaje , su uso implica el riesgo de perder información accidentalmente. [ 1 ] Los usuarios tienden a envolver las llamadas a rmen mecanismos de seguridad para limitar la eliminación accidental. Existen utilidades de recuperación que intentan reconstruir el índice y pueden recuperar el archivo si su almacenamiento no se reutilizó.
Originalmente desarrollado para Unix , hoy también está disponible en sistemas tipo Unix y no tipo Unix, KolibriOS , [ 2 ] IBM i , [ 3 ] EFI shell . [ 4 ] y Windows (a través de UnxUtils ). [ 5 ] El delcomando proporciona una capacidad similar en MS-DOS , OS/2 y Símbolo del sistema .
Al igual que rm, el unlinkcomando también elimina (desvincula) archivos, pero solo un archivo a la vez.
Historia
En algunas versiones antiguas de Unix, el rmcomando eliminaba directorios si estaban vacíos. [ 6 ] Este comportamiento aún se puede obtener en algunas versiones con rmla -dbandera, por ejemplo, los BSD (como FreeBSD , [ 7 ] NetBSD , [ 8 ] OpenBSD [ 9 ] y macOS ) derivados de 4.4BSD-Lite2.
La versión en GNU Core Utilities fue escrita por Paul Rubin, David MacKenzie, Richard Stallman y Jim Meyering. [ 10 ] Esta versión proporciona una -dopción para ayudar con la compatibilidad. [ 11 ] La misma funcionalidad la proporciona el rmdircomando estándar.
Opciones
Opciones que suele proporcionar la implementación de un comando:
-r, recursivo ; elimina directorios y su contenido de forma recursiva-i, interactivo ; solicitar al usuario que confirme la eliminación de cada archivo-f, fuerza ; ignora los archivos inexistentes y anula cualquier solicitud de confirmación (cancelando efectivamente-i), no permite eliminar archivos de un directorio protegido contra escritura-v, verboso ; estado del registro-d, directorio ; elimine cualquier directorio vacío--one-file-system, solo elimina archivos en el mismo sistema de archivos que el argumento; ignora los sistemas de archivos montados.
Usar
Por defecto, rmelimina los archivos especificados, pero no elimina un directorio. [ 12 ] Por ejemplo, lo siguiente elimina el archivo llamado foo
$ rm foo Pero ese comando falla si foo es un directorio. Para eliminar el directorio foo :
$ rm -r foo Este comando se suele usar con xargs para proporcionar una lista de archivos:
$ xargs rm < lista de archivos Para eliminar todas las imágenes PNG de todos los directorios inferiores al actual:
$ find . -name '*.png' -exec rm {} + Seguridad
Permisos
En la mayoría de los sistemas de archivos, eliminar un archivo requiere permisos de escritura y ejecución en el directorio que lo contiene. Algunos podrían confundirse al pensar que los permisos del archivo a eliminar son irrelevantes. Sin embargo, la implementación de GNU confirma la eliminación de un archivo protegido contra escritura a menos que se utilice la opción -f. [ 13 ]
Para eliminar un directorio (usando -r), su contenido debe eliminarse recursivamente. Esto requiere que el usuario tenga permisos de lectura, escritura y ejecución para el directorio (si no está vacío) y cualquier subdirectorio no vacío recursivamente. Se necesita permiso de lectura para listar el contenido del directorio. Esto a veces genera una situación extraña en la que un directorio no vacío no se puede eliminar porque el usuario no tiene permiso de escritura para él y, por lo tanto, no puede eliminar su contenido, pero si el mismo directorio estuviera vacío, el usuario podría eliminarlo. [ 14 ]
Si un archivo reside en un directorio con el bit de permanencia activado , para eliminarlo es necesario que el usuario sea el propietario del archivo.
Prevención de la eliminación accidental
Comandos como estos rm -rf *son relativamente riesgosos, ya que pueden eliminar muchos archivos de forma irrecuperable. Dichos comandos a veces se mencionan en anécdotas sobre errores desastrosos, [ 15 ] como durante la producción de la película Toy Story 2. [ 16 ]
Para minimizar el riesgo de eliminación accidental de archivos, una técnica común consiste en ocultar el rmcomando predeterminado tras un alias o una función que incluya la opción interactiva. Por ejemplo:
alias rm = "rm -i"o
rm () { /bin/rm -i " $@ " ; }Luego, por defecto, rmrequiere que el usuario confirme la eliminación de cada archivo presionando Yo más . Para omitir la confirmación, un usuario puede incluir la opción (ya que la opción especificada más adelante en la línea de comandos expandida " " tiene prioridad).NReturn-frm -i -f
Desafortunadamente, esto puede provocar otras eliminaciones accidentales, ya que acostumbra a los usuarios a ser descuidados con los comodines que pasan a rm, además de fomentar la tendencia a presionar y confirmar sin pensar. Incluso se ha visto a usuarios llegar al extremo de usar , que confirma automáticamente la eliminación de cada archivo.YReturnyes | rm files
Se puede lograr un compromiso que permita a los usuarios confirmar solo una vez, fomente el uso adecuado de comodines y facilite la verificación de la lista con algo como lo siguiente:
if [ -n " $PS1 " ] ; then rm () { ls -FCsd " $@ " echo '¿eliminar[ny]? ' | tr -d '\012' ; read if [ "_ $REPLY " = "_y" ] ; then /bin/rm -rf " $@ " else echo '(cancelado)' fi } fiPodría decirse que esta función no debería convertirse en un script de shell , ya que correría el riesgo de que se encuentre antes que el sistema rmen la ruta de búsqueda, ni debería permitirse en shells no interactivos donde podría interrumpir trabajos por lotes. Incluir la definición dentro de la estructura protege contra esto último.if [ -n "$PS1" ] ; then .... ; fi
Otros comandos están diseñados para evitar la eliminación accidental, incluidos safe-rm[ 17 ] y trash. [ 18 ]
Protección de la raíz del sistema de archivos
El rm -rf /comando, si lo ejecuta un superusuario , provoca que se eliminen todos los archivos del sistema de archivos. Por seguridad, Sun Microsystems introdujo una protección especial para este comando en Solaris 10 (lanzado por primera vez en 2005). La implementación informa que /no se permite la eliminación. [ 19 ] Poco después, se introdujo la misma funcionalidad en la implementación de FreeBSD . [ 20 ] La versión de GNU se niega a ejecutarse rm -rf /si --preserve-rootse incluye la opción, [ 21 ] que ha sido el valor predeterminado desde la versión 6.4 de GNU Core Utilities . En sistemas más recientes, este mecanismo de seguridad está siempre activo, incluso sin la opción. Para ejecutar el comando, el usuario debe eludir el mecanismo de seguridad añadiendo la opción --no-preserve-root, incluso si es el superusuario.
Limitaciones
La implementación de GNU Core Utilities tiene límites en los argumentos de la línea de comandos. Los argumentos están nominalmente limitados a 32 veces el tamaño de página asignado por el kernel. Los sistemas con un tamaño de página de 4 KB tendrían, por lo tanto, un límite de tamaño de argumento de 128 KB. [ 22 ] Para los argumentos de la línea de comandos anteriores al kernel 2.6.23, los límites se definieron en el momento de la compilación del kernel y se pueden modificar cambiando la variable MAX_ARG_PAGESen include/linux/binfmts.hel archivo. [ 23 ] [ 24 ] Los kernels más recientes limitan la longitud máxima del argumento al 25 % del límite máximo de la pila (ulimit -s). Superar el límite produce un error. [ 25 ]
Véase también
- deltree – Comando en DOS y Windows 9x Páginas que muestran descripciones breves de destinos de redirección
- dsw (comando) – Comando de shell obsoleto para eliminar archivos con nombres impronunciables
Referencias
- ↑ "Unix - Preguntas frecuentes (3/7) [ Publicación frecuente ] Sección - ¿Cómo "recupero" un archivo?" . www.faqs.org . Archivado del original el 10-10-2012 . Consultado el 03-08-2010 .
- ↑ "Shell - KolibriOS wiki" . wiki.kolibrios.org . Archivado del original el 11 de febrero de 2019. Consultado el 11 de agosto de 2019 .
- ↑ IBM . "IBM System i Versión 7.2 Programación Qshell" (PDF) . IBM . Archivado (PDF) del original el 18-09-2020 . Recuperado el 05-09-2020 .
- ↑ "EFI Shells and Scripting" . Intel . Archivado del original el 27/09/2013 . Consultado el 25/09/2013 .
- ↑ "Adaptaciones nativas para Win32 de algunas utilidades GNU" . unxutils.sourceforge.net . Archivado del original el 9 de febrero de 2006. Consultado el 11 de agosto de 2025 .
- ↑ "rm página de la Sección 1 del manual de Unix 8.º" . man.cat-v.org . Archivado del original el 14-12-2013 . Recuperado el 10-12-2013 .
- ↑ "RM(1)" , FreeBSD-5.4-RELEASE , consultado el 5 de febrero de 2015
- ↑ "RM(1)" , NetBSD-2.0 , archivado del original el 4 de marzo de 2016 , recuperado el 5 de febrero de 2015
- ↑ "RM(1)" , OpenBSD-3.6 , consultado el 5 de febrero de 2015
- ↑ "rm(1): eliminar archivos/directorios - página man de Linux" . linux.die.net . Archivado del original el 27-10-2018 . Consultado el 24-01-2019 .
- ↑ Krzysztof Goj (22 de enero de 2012). "rm: nueva opción --dir (-d) para eliminar directorios vacíos" . coreutils.git .
- ↑ "rm(1) - Página del manual de Linux" . man7.org . Archivado del original el 9 de julio de 2013. Consultado el 12 de septiembre de 2020 .
- ↑ "Ayuda y ejemplos del comando rm de Linux" . ComputerHope . 24 de enero de 2018. Archivado del original el 16 de abril de 2016. Consultado el 24 de enero de 2019 .
- ↑ McElhearn, Kirk (2 de enero de 2014). "Domina la línea de comandos: Eliminando archivos y carpetas" . Macworld . Archivado del original el 25 de enero de 2019. Recuperado el 24 de enero de 2019 .
- ↑ Gite, Vivek. "Linux/UNIX: Eliminar un archivo" . Nixcraft. Archivado del original el 24 de junio de 2012. Recuperado el 24 de noviembre de 2011 .
- ↑ 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 | Media . Recuperado el 27 de septiembre de 2022 .
- ↑ "Safe-rm en Launchpad" . Launchpad . Archivado del original el 5 de junio de 2023. Consultado el 12 de septiembre de 2020 .
- ↑ "andreafrancia/trash-cli" . 12 de septiembre de 2020. Archivado del original el 1 de agosto de 2015. Recuperado el 9 de noviembre de 2015 a través de GitHub.
- ↑ "Entrometiéndose en los asuntos de los magos" . Archivado del original el 3 de noviembre de 2016.
- ↑ "La confirmación anterior agregó código a rm(1) para advertir y eliminar cualquier · freebsd/freebsd@d6b7bd9" . GitHub . Archivado del original el 11 de febrero de 2017. Recuperado el 15 de abril de 2016 .
- ↑ "rm invocation (GNU Coreutils)" . www.gnu.org . Archivado del original el 2 de julio de 2016 . Consultado el 22 de julio de 2016 .
- ↑ "Cómo sortear el límite de "Demasiados argumentos" de Linux" . Stackoverflow .
Con la vinculación de ARG_MAX a ulim -s / 4 se introdujo MAX_ARG_STRLEN como longitud máxima de un argumento [...] MAX_ARG_STRLEN se define como 32 veces el tamaño de página en linux/include/uapi/linux/binfmts.h [...] El tamaño de página predeterminado es de 4 KB, por lo que no se pueden pasar argumentos de más de 128 KB [...]
- ↑ "Linux_2_6_23 - Linux Kernel Newbies" . kernelnewbies.org . Archivado del original el 24/04/2018 . Consultado el 03/04/2018 .
- ↑ "kernel/git/torvalds/linux.git - Árbol de código fuente del kernel de Linux" . git.kernel.org . Archivado del original el 4 de marzo de 2018. Consultado el 3 de abril de 2018 .
- ↑ ""Lista de argumentos demasiado larga": Más allá de los argumentos y las limitaciones | Linux Journal" . www.linuxjournal.com . Archivado del original el 4 de agosto de 2020. Consultado el 12 de septiembre de 2020 .
Lecturas adicionales
- McElhearn, Kirk (2006). La línea de comandos de Mac OS X: Unix bajo el capó . John Wiley & Sons . ISBN 978-0470113851.
Enlaces externos
- : eliminar entradas de directorio – Referencia de Shell y utilidades, Especificación única de UNIX , Versión 5 de The Open Group
- – Manual del programador de Plan 9 , Volumen 1
- – Manual de comandos generales de Inferno
- Eliminación de archivos
- Programas estándar de Unix
- Utilidades Unix SUS2008
- Órdenes del Plan 9
- Comandos de Inferno (sistema operativo)
- Comandos de Qshell para IBM i