En informática , rm
(abreviatura de eliminar ) es un comando básico en Unix y sistemas operativos similares a Unix que se utiliza para eliminar objetos como archivos de computadora , directorios y enlaces simbólicos de sistemas de archivos y también archivos especiales como nodos de dispositivos , tuberías y sockets , similares al del
comando en MS-DOS , OS / 2 y Microsoft Windows . El comando también está disponible en el shell EFI .[1]
Autor (es) original (es) | Ken Thompson , Dennis Ritchie ( Laboratorios Bell de AT&T ) |
---|---|
Desarrollador (es) | Varios desarrolladores comerciales y de código abierto |
Versión inicial | 3 de noviembre de 1971 |
Sistema operativo | Unix , similar a Unix , V , Plan 9 , Inferno , KolibriOS , IBM i |
Plataforma | Multiplataforma |
Tipo | Mando |
Licencia | coreutils : GPLv3 + |
Descripción general
El rm
comando elimina las referencias a objetos del sistema de archivos mediante la llamada al sistema de desvinculación , donde esos objetos pueden haber tenido múltiples referencias (por ejemplo, un archivo con dos nombres diferentes), y los objetos en sí se descartan solo cuando se han eliminado todas las referencias y no los programas todavía tienen 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 por fallar.
El comando generalmente no destruye los datos del archivo, ya que su propósito es simplemente desvincular las referencias, y el espacio del sistema de archivos liberado aún puede contener 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 enlace, y hay disponibles programas como shred y srm que proporcionan específicamente la capacidad de borrar datos.
rm
generalmente 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 incluir rm
algún tipo de contenedor para limitar la eliminación accidental de archivos.
Hay 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 rm
comando eliminaría directorios si estuvieran vacíos. [3] Este comportamiento todavía se puede obtener en algunas versiones de rm
con la -d
bandera, por ejemplo, los BSD (como FreeBSD , [4] NetBSD , [5] OpenBSD [6] y macOS ) derivados de 4.4BSD-Lite2.
La versión de coreutilsrm
incluida en GNU fue escrita por Paul Rubin, David MacKenzie, Richard Stallman y Jim Meyering. [7] Esta versión también ofrece una opción para ayudar con la compatibilidad. [8] El comando estándar proporciona la misma funcionalidad .-d
rmdir
La -i
opción en la Versión 7 reemplazada dsw
, o "eliminar de los conmutadores", que debutó en la Versión 1 . Doug McIlroy escribió que dsw
"era una herramienta desesperada diseñada para limpiar archivos con nombres indecibles". [9]
KolibriOS incluye una implementación del rm
comando. [10]
El comando rm también se ha trasladado al sistema operativo IBM i . [11]
Sintaxis
rm
elimina el archivo especificado después de agregar las opciones. Los usuarios pueden utilizar una ruta completa o una ruta de archivo relativa para especificar los archivos que se eliminarán. rm
no elimina un directorio de forma predeterminada. [12]rm foo
elimina el archivo " foo " en el directorio en el que se encuentra actualmente el usuario.
rm
, como otros comandos, usa opciones para especificar cómo se comportará:
-r
, "recursivo", que elimina directorios, eliminando el contenido de forma recursiva de antemano (para no dejar archivos sin un directorio en el que residir).-i
, "interactivo" que solicita que se confirmen todas las eliminaciones.-f
, "force", 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
, "detallado", que imprime lo querm
está 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.
rm
puede ser cubierta por una cáscara de alias ( C shell alias , Bourne shell o Bash) función de " rm -i
" a fin de 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 -i
argumento agregando la -f
opción (ya que la opción especificada más adelante en la línea de comando expandida " rm -i -f
" 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 -rf
(diversamente, rm -rf /
, rm -rf *
, y otros) se utiliza frecuentemente en chistes y anécdotas sobre desastres Unix. [13] La rm -rf /
variante del comando, si lo ejecuta un superusuario , haría que todos los archivos accesibles desde el sistema de archivos actual se eliminen de la máquina.
rm
se utiliza a menudo junto con xargs para proporcionar una lista de archivos para eliminar:
xargs rm
O, para eliminar todas las imágenes PNG en todos los directorios debajo del actual:
encontrar . -nombre '* .png' -exec rm {} +
Permisos
Por lo general, en la mayoría de los sistemas de archivos, eliminar un archivo requiere permiso de escritura en el directorio principal (y permiso de ejecución, para poder ingresar al directorio en primer lugar). (Tenga en cuenta que, confusamente para los principiantes, los permisos sobre el archivo en sí son irrelevantes. Sin embargo, GNU rm
solicita confirmación si se va a eliminar un archivo protegido contra escritura, a menos que se use la opción -f). [14]
Para eliminar un directorio (con rm -r
), uno debe eliminar todo su contenido de forma recursiva. Esto requiere que uno debe tener permiso de lectura, escritura y ejecución para ese directorio (si no está vacío) y todos los subdirectorios no vacíos de forma recursiva (si hay alguno). Los permisos de lectura son necesarios para enumerar el contenido del directorio con el fin de eliminarlos. Esto a veces conduce a una situación extraña en la que un directorio que no está vacío no se puede eliminar porque uno no tiene permiso de escritura y, por lo tanto, no se puede eliminar su contenido; pero si el mismo directorio estuviera vacío, se podría eliminar. [15]
Si un archivo reside en un directorio con el bit adhesivo establecido, para eliminar el archivo es necesario que uno sea el propietario del archivo.
Protección de la raíz del sistema de archivos
Sun Microsystems introdujo " rm -rf /
" protección en Solaris 10, lanzado por primera vez en 2005. Al ejecutar el comando, el sistema ahora informa que la eliminación de / no está permitida. [16] Poco después, se introdujo la misma funcionalidad en la versión de la utilidad FreeBSDrm
. [17] GNU se rm
niega a ejecutarse rm -rf /
si --preserve-root
se da la opción, [18] que ha sido el valor predeterminado desde que se lanzó la versión 6.4 de GNU Core Utilities en 2006. En los sistemas más nuevos, este sistema de seguridad siempre está activo, incluso sin la opción. Para ejecutar el comando, el usuario debe omitir el a prueba de fallas agregando la opción --no-preserve-root
, incluso si es el superusuario.
Prueba de usuario
Los administradores de sistemas, los diseñadores e incluso los usuarios a menudo intentan defenderse contra la eliminación accidental de archivos creando un alias o una función del tipo:
alias rm = "rm -i"
rm () { / bin / rm -i " $ @ " ; }
Esto da como resultado rm
pedirle al usuario que confirme archivo por archivo si debe eliminarse, presionando la tecla Y o N. Desafortunadamente, esto tiende a entrenar a los usuarios a ser descuidados con los comodines que entregan en sus rm
comandos, así como a fomentar una tendencia a aporrear alternativamente y
y la tecla de retorno para afirmar elimina, hasta pasar el único archivo que necesitaban conservar. [ cita requerida ] Incluso se ha visto a los usuarios yendo tan lejos como " ", que inserta automáticamente "y" para cada archivo. [ cita requerida ]yes | rm files
Un compromiso que permite a los usuarios confirmar solo una vez, fomenta el uso de comodines adecuados 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" ] ; luego / bin / rm -rf " $ @ " else echo '(cancelado)' fi } fi
Es importante tener en cuenta que esta función no debe convertirse en un script de shell, lo que correría el riesgo de que se encontrara antes que el sistema rm
en la ruta de búsqueda, ni debería permitirse en shells no interactivos donde podría romper los trabajos por lotes. . Incluir la definición en el if [ -n "$PS1" ] ; then .... ; fi
constructo protege contra este último.
Existen alternativas de terceros que evitan la eliminación accidental de archivos importantes, como "safe-rm" [19] o "trash". [20]
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 los argumentos de la línea de comandos bytes número de páginas que se asignan dentro del kernel para argumentos de la línea de comandos antes del kernel 2.6.23 Lanzado el 9 de octubre de 2007 [21] [22] se definieron en tiempo de compilación del kernel en la variable MAX_ARG_PAGES
en el include/linux/binfmts.h
archivo, pero los nuevos kernels limitan la longitud máxima del argumento al 25% del límite máximo de pila (ulimit -s). Error: se /bin/rm: Argument list too long.
le preguntará si se supera el límite de argumentos de la línea de comandos [23]
Ver también
- srm (Unix) : eliminación segura de archivos en Unix
- unlink () : la llamada al sistema subyacente llamada por este programa de espacio de usuario para su funcionalidad principal
- del (comando)
- deltree
- dsw (comando) : un comando Unix obsoleto para eliminar archivos difíciles
Referencias
- ^ "Cáscaras de EFI y secuencias de comandos" . Intel . Consultado el 25 de septiembre de 2013 .
- ^ "Unix - Preguntas frecuentes (3/7) Sección [Publicación frecuente] - ¿Cómo puedo" recuperar "un archivo?" . www.faqs.org .
- ^ "Página rm de la Sección 1 del 8º manual de Unix" . man.cat-v.org .
- ^ "RM (1)" , FreeBSD-5.4-RELEASE , consultado el 5 de febrero de 2015
- ^ "RM (1)" , NetBSD-2.0 , consultado 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 de manual de Linux" . linux.die.net .
- ^ Krzysztof Goj (22 de enero de 2012). "rm: nueva opción --dir (-d) para eliminar directorios vacíos" . coreutils.git .
- ^ McIlroy, MD (1987). Un lector de investigación Unix: extractos comentados del Manual del programador, 1971–1986 (PDF) (Informe técnico). CSTR. Bell Labs. 139.
- ^ "Shell - KolibriOS wiki" . wiki.kolibrios.org .
- ^ IBM . "IBM System i Versión 7.2 Programación Qshell" (PDF) . Consultado el 5 de septiembre de 2020 .
- ^ "rm (1) - Página de manual de Linux" . man7.org .
- ^ Casa rural, Vivek. "Linux / UNIX: eliminar un archivo" . Nixcraft . Consultado el 24 de noviembre de 2011 .
- ^ "Ayuda y ejemplos del comando rm de Linux" . ComputerHope . 24 de enero de 2018 . Consultado el 24 de enero de 2019 .
- ^ McElhearn, Kirk (2 de enero de 2014). "Domina la línea de comandos: eliminar archivos y carpetas" . Macworld . Consultado el 24 de enero de 2019 .
- ^ "Intromisión en los asuntos de los magos" . Archivado desde el 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 .
- ^ "invocación rm (GNU Coreutils)" . www.gnu.org .
- ^ "Safe-rm en Launchpad" . Launchpad .
- ^ "andreafrancia / trash-cli" . 12 de septiembre de 2020 - a través de GitHub.
- ^ "Linux_2_6_23 - Principiantes del kernel de Linux" . kernelnewbies.org .
- ^ "kernel / git / torvalds / linux.git - árbol de fuentes del kernel de Linux" . git.kernel.org .
- ^ " " Lista de argumentos demasiado larga ": más allá de los argumentos y limitaciones | Linux Journal" . www.linuxjournal.com .
Otras lecturas
- McElhearn, Kirk (2006). La línea de comandos de Mac OS X: Unix Under the Hood . John Wiley e hijos . ISBN 978-0470113851.
enlaces externos
- : eliminar entradas de directorio: referencia de comandos y utilidades, la especificación única de UNIX , número 7 de The Open Group
- - Manual del programador de Plan 9 , Volumen 1
- - Manual de comandos generales de Inferno