Intención:
rm -rf string*
Problema:
rm -rf string *
El primer caso es un uso legítimo y común de rm, un error tipográfico pequeño puede causar muchos problemas en el segundo caso. ¿Existe una manera simple de protegerse de manera inteligente contra un comodín inicial o final accidental?
zsh
obash
) prefiero tomar el hábito de presionar la tecla tab (para activar la finalización automática) antes de presionar la tecla de retornotouch -- -i
creará un archivo-i
que se pasarárm
como parámetro-i
cuando incluya un comodín en sus argumentos.rm *
. Si tipificarm name *
, se expandirá arm name -i other names
.-i
no se procesará como una opción porque no está antes de los nombres de archivo.Respuestas:
Se
DEBUG
podría escribir una trampa para cancelar los comandos que parecen sospechosos. Lo siguiente, o un código similar, se puede agregar a su~/.bashrc
:Ajusta la lógica al gusto.
(En realidad, no espero que este enfoque sea útil, demasiadas formas de desordenar un comando destructivamente para encontrarlos probando uno por uno, pero proporciona una respuesta literal a la pregunta).
fuente
No hay forma de un sistema totalmente a prueba de balas. Y agregando "¿Estás seguro?" Las preguntas sobre las cosas son contraproducentes y conducen a "Por supuesto que estoy seguro". Reacciones de kneejerk.
Un truco que aprendí de un libro en años pasados es hacer primero
ls -R blah*
, hacerrm -fr blah*
si y solo si la lista que apareció apareció lo que quería.Es bastante fácil hacer el
ls
comando primero, luego ↑, eliminarls -R
y reemplazar conrm -fr
.La última pregunta es: "Si la información fue valiosa para usted, ¿dónde está su respaldo?"
fuente
^ls -R^rm -rf^
y establecer como un aliasls -R
lo que básicamente hago todo el tiempo, pero es tan instintivo en este punto que se me escapó la mente consciente cuando me formé por respuesta. Entonces +1 para eso.cat > .log
, luego regreso y pego o tiro el nombre del archivo antes del.log
. Entonces, en ningún momento tengo> valuablefile
en el cmdline.rm -i
, por lo que a menudo solo redacto mi comando rm y luego pongo un\
al comienzo de la línea. (\rm
evita la expansión de alias para rm, ya que parte de la palabra fue citada). Si necesitaba un-r
o-f
, sí, a veces empiezo con enls
lugar derm
, o simplemente dejo la-rf
parte. (editar, ¿cómo se obtiene un formato de código de barra invertida? bquote bslash bslash bquote falla.¿Puedes entrenarte para usar, por ejemplo,
rmrf
en lugar derm -rf
?Si es así, esta función bash le brindará la oportunidad de ver qué sucedería realmente antes de confirmar el comando:
Para que esta función sea permanente, agregue esta línea al
~/.bashrc
archivo en cada computadora que use.Comparación con el
rm
alias comúnEs común definir un alias:
Esto tiene dos limitaciones:
Si depende de este alias, se sorprenderá cuando esté en una máquina o en un entorno que no lo tenga. Por el contrario, intentar ejecutar
rmrf
en una máquina sin esa función devolverá un inofensivocommand not found
.Este alias no es de ayuda en su caso porque la
-f
opción que proporciona en la línea de comando anula la-i
opción en el alias.fuente
rm -rf
comando incorrecto , ¿qué sucede? Crear pseudo funciones como esta en última instancia solo complica una solución simple: solo tenga más cuidado y comprenda qué son los permisos.rmrf
, en lugar de simplemente crear una función de shellrm
que verifique los argumentos-r
o-rf
, y promulgue una lógica especial en ese caso, de lo contrario, llame directamentecommand rm "$@"
para invocar elrm
comando real ?-f
si no tienes-i
. Dejarlo apagado-f
le da una advertencia adicional antes de eliminar un archivo de solo lectura, por ejemplo.Si estoy en una situación en la eliminación de los archivos incorrectos es un acuerdo muy grande, una de las cosas que he hecho es hacer una carpeta papelera, como
mkdir trashcan
, y luego tengo un scriptrmTrashcan
que tiene unarm -rf trashcan/*
orm -rf *
o similares, escrito con mucho cuidado y comprobado varias veces.De esa manera, si cometo un error, el error está en un
mv
comando, no en unrm
comando. Una vez que hago unals
y persuadido de exactamente lo que estoy borrando, unarmTrashcan
realidad hace el trabajo sucio con seguridad.También fue tremendamente conveniente para una situación en la que tuve que eliminar copias de seguridad. Podía
mv
un mes entero de copias de seguridad en la papelera,mv
las pocas que quería mantener (1 de mes, 15 de mes) de nuevo en las copias de seguridad, luegormTranshcan
el resto. Hacer un comando similar es difícil de hacerrm
por sí solo, y hacerlo de esta manera me permitió tenerls
las copias de seguridad para estar seguro de qué archivos estoy dejando atrás (en lugar de simplemente enumerar los archivos que pretendo eliminar)fuente
En lugar de molestarse con dos comandos (
ls
yrm
), creo que es una forma más simple y fácil de usarfind
:Si accidentalmente escribe
"string *"
, eliminará los archivos con el nombrestring chars
ystring letters
(que es lo que quería de todos modos), pero no tomará todos los archivos como*
en un shell.Además, puede dejar de
-delete
ver los archivos que va a eliminar, luego presionar la flecha hacia arriba y escribir-delete
más fácilmente que escribir^ls -R^rm -rf
u otras tonterías.fuente
find
realizará una búsqueda anidada de archivos que coincidan en lugar de solo los parámetros explícitos declarados en la línea de comandos. Creo que esto pierde la marca. Aunque podría estar equivocado.Realmente no. Se propone en otra respuesta que podría crear un comando personalizado para agregar un aviso antes de ejecutar una tarea. Pero el problema con este comando personalizado es que debe instalarse conscientemente en los sistemas en los que está trabajando. E incluso si está instalado, el problema es que tu reflejo de golpe
y
para completar la tarea podría entrar en juego.Lo que significa que todo esto es un problema de interfaz de usuario, incluso si está en un nivel de línea de texto / comando. ¿Cuántas redes de seguridad esperas que haya para protegerte de hacer algo que no deberías? Es como un par de tijeras: si eres negligente y te resbalas y te cortas la mano mientras intentas cortar tela o papel, ¿quién tiene la culpa? O incluso semáforos y señales de alto: realmente no hay nada que impida que un conductor encienda un semáforo o ignore las señales de tránsito que no sea una aguda conciencia de lo que podría suceder si se involucran en un comportamiento tan arriesgado.
Dicho esto, la mejor solución realista radica en los permisos del sistema para usuarios y grupos. Esa es la mejor / única red de seguridad real para proteger a un usuario de sí mismo.
Si está trabajando en un sistema en el que es el único que accede a él, puede sentirse tentado a
chmod 777
todo, pero esa no es la forma en que se configura un sistema racional. En cambio, los permisos deberían ser algo así como755
para todos los directorios y644
para todos los archivos no ejecutables. Los archivos ejecutables deben ser755
al menos, pero tal vez incluso744
si solo desea que otros lean pero no ejecuten los archivos.fuente
Intente componer su
rm
comando inicial sin la-f
bandera, sino con-i
una querm
le solicite cada archivo que intente eliminar. Para pequeñas eliminaciones recursivas, puede mantener presionada la ytecla, una vez que esté seguro de que el comando se ha escrito correctamente. Para eliminaciones grandes, puede abortar la operación y usar el historial de la línea de comandos para cambiar cuidadosamente el-i
a-f
.fuente
y[RETURN]
cada archivo, no hay nada que pueda mantener presionado con GNU rm. Editar-i
es el camino a seguir, una vez que tenga el comando escrito correctamente. Luego obtienes un mensaje solo en un archivo de solo lectura, y tal vez otras cosas.rm -I
para que solo se solicite una vez, y solo para eliminaciones potencialmente peligrosas (es decir, de muchos archivos).rm tiene
-i
y-I
marcas para confirmar antes de cada eliminación. En el pasado, algunas distribuciones los activaron de manera predeterminada. Esta es una idea terrible. Dele al usuario demasiados cuadros de diálogo de confirmación para las operaciones normales y comenzarán a confirmarlos habitualmente. Esto simplemente cambia el requisito de "tener cuidado" (siempre una bandera roja) a un diálogo nuevo y más molesto. "Sí. Sí. Sí. ¡Sí! ¡SÍ! Maldita sea, estúpida computadora, simplemente borra los archivos SÍ SÍ SÍ SÍ - ¡MIERDA, NO QUIERO! Este es el problema de diálogo "Sí, pero no quise decir". Esta respuesta proporciona una explicación visual de por qué los cuadros de diálogo de confirmación llegan en el momento equivocado.El tipo de error que describes es un deslizamiento , "la realización de una acción que no era lo que se pretendía". El usuario generalmente reconoce inmediatamente el error y sabe exactamente cómo solucionarlo. Desafortunadamente, Unix no le da la oportunidad al usuario, rm elimina el archivo inmediatamente. Todos los demás sistemas operativos resuelven este problema permitiendo que se eliminen las eliminaciones, al menos durante un tiempo, mediante el uso de la Papelera.
Hay varios sistemas de basura para Unix, y esta respuesta está llena de sugerencias .
La pregunta es alias rm o no alias rm. Pros aliasing rm ...
Contras para aliasing rm ...
Si sigue demasiado lejos el primer argumento, termina usando vi (no vim, vi), csh (no tcsh, csh) y otras utilidades anticuadas porque están disponibles universalmente. Aún así, existe el peligro de personalizar en exceso su entorno. Prefiero llevar mis utilidades conmigo y hacer que sea lo más fácil posible. YMMV.
Dos y tres son problemas técnicos. Se pueden resolver con un ingenioso trabajo de segador que verifica el tamaño de la basura y limpia periódicamente las cosas, de forma similar a un tmpreaper . Esto puede ser un trabajo cron, o una versión más inteligente puede hacer uso de las diversas infraestructuras de eventos del sistema de archivos disponibles en muchas distribuciones Linux de escritorio. Esto no es simple, y aún más difícil de hacer de manera eficiente. Es mejor encontrar un sistema existente que tratar de hacer uno propio.
El cuarto puede tratarse haciendo que su nueva rm sea un alias de shell
alias rm='trash'
, entonces no afectará a los programas.El quinto es un problema que dejo para que el lector lo resuelva. rm no tiene muchos interruptores.
fuente
rm -i
, pero a menudo uso\rm
para obtener el comportamiento sin alias. Escriborm -i
cada vez que estoy PLANEANDO para decir no a uno de los argumentos. A veces comienzo el comando conls
el comando, luego solo pongo el \ rm cuando termino. Así que no hay manera de que pueda presionar accidentalmente el retorno enrm -rf /
lugar de/.../file
rm -I
orm --interactive=once
es mucho, mucho menos molesto querm -i
, y aún atrapa algo peligroso (solo aparece cuando hay más de 3 archivos, o si es recursivo, y solo UNA VEZ en vez de POR CADA ARCHIVO).-i
podría darle tiempo al usuario para cambiar los objetivos. Esta respuesta a una pregunta relacionada lo expone todo.rm -i
durante más de 30 segundos sin apagarlo. Mientras querm -I
solo te avisa cuando es probable que te hayas equivocado; el aviso solo aparece para grandes eliminaciones. Cuando intentaba eliminar un par de cosas y aparece el mensaje, se sorprende y se da cuenta de que accidentalmente escribió "foo *".-rf
que acabo de descubrir) son proxys pobres para detectar un posible error. No es probable que desee eliminar un subdirectorio. El mensaje no ayuda porque solo confirma lo que el usuario dijo que hiciera sin agregar información útil en un momento en que el usuario no está buscando verificar. "rm: ¿eliminar 1 argumento recursivamente?" "Sí, elimine el directorio, ¡acabo de decirle que haga eso! ... espere, ¿qué directorio fue ese? ¡¡MIERDA !!!"Enseño a todos sobre el
!$
= último argumento en el último truco del comando:Esto permite una inspección de la expansión de comodines, y luego usar el mismo patrón de globo sin la posibilidad de insertar un espacio antes del
*
.También sugiero que la gente nunca corte y pegue un patrón comodín en una línea de comando potencialmente destructiva. Porque en mis propias manos eso ha sido un problema :)
Un técnico en mi laboratorio cometió este error la semana pasada (3 meses de trabajo), y sí, tuvimos una copia de seguridad (1 día de retraso).
fuente
Todo el mundo parece decir: "Ten más cuidado", "No hagas un alias / confirmación porque te habrás acostumbrado a no prestarle la debida atención".
Genial, y todo. Quiero decir, no creo que debas hacer un alias para
rm
(nirmrf
, ya que podrías arruinarlo fácilmente y escribir el comando real).Pero, ¿por qué no puede crear un alias / script y llamarlo, decirlo
remove
y solo alimentarlo con un argumento (por ejemplo, $ 1)? El comodín debería ser de $ 2, debido al espacio inadvertido (¿amiright?) Y, por lo tanto, su script / wrapper / alias no se alimentará con el segundo. Sí, solo puede hacer un conjunto de eliminaciones (con un comodín) a la vez, pero ese es el precio que pagaría.Si estuviera escribiendo algo bueno, podría hacer que me diga la cantidad de archivos y directorios que planea eliminar, y el tamaño total de las cosas que estaba eliminando, y luego pedir una confirmación, pero eso podría impedir su flujo. ¿Quizás hacer de eso una opción de bandera
remove
? (-yo). También es posible que desee hacer un cheque de $ 1 para ver si es solo un comodín y solicitar una confirmación, y enumerar en qué directorio se encuentra realmente.Por otro lado, hay una serie de
rm
reemplazos por ahí. Muchos están tratando de cumplir con la papelera de escritorio de la interfaz de usuario. Puede que valga la pena analizar algunos de ellos.fuente
remove \*
? Si su script permite que el shell expanda su entrada globalmente, no veo que ayude mucho.Un truco muy simple es poner
-rf
al final:rm whatever* -rf
esto reduce drásticamente la tasa de error, porque escribe más caracteres después del
*
, por lo que tiene más tiempo para ver errores tipográficos.Esto no resuelve todo. Solo un simple truco diario.
fuente