Simplemente corrí rm -rf /*
accidentalmente, pero quise decir rm -rf ./*
(note la estrella después de la barra).
alias rm='rm -i'
y --preserve-root
por defecto no me salvó, entonces, ¿hay alguna protección automática para esto?
No era root y cancelé el comando de inmediato, pero había algunos permisos relajados en algún lugar o algo así porque noté que mi mensaje Bash ya no funcionaba. No quiero confiar en los permisos y no ser root (podría cometer el mismo error sudo
), y no quiero buscar errores misteriosos debido a que falta un archivo en alguna parte del sistema, por lo tanto, las copias de seguridad sudo
son buenas , pero me gustaría algo mejor para este caso específico.
Sobre pensar dos veces y usar el cerebro. ¡Lo estoy usando en realidad! Pero lo estoy usando para resolver algunas tareas de programación complejas que involucran 10 cosas diferentes. Estoy inmerso en esta tarea lo suficientemente profundo, no queda ningún poder cerebral para verificar indicadores y rutas, ni siquiera pienso en términos de comandos y argumentos, pienso en términos de acciones como 'directorio actual vacío', diferente parte de mi cerebro los traduce a comandos y a veces comete errores. Quiero que la computadora los corrija, al menos los peligrosos.
rm -rf . /mydir
lugar derm -rf ./mydir
matar el directorio en el que se encontraba. Creo que esto sucede con más frecuencia.rm
no es un arma, es un programa de computadora, podría ser lo suficientemente inteligente como para determinar que el usuario eliminará algunos archivos importantes y emitirá una advertencia (como en realidad lo hace si intentasrm -rf /
prescindir de una estrella).rm
comando es una pregunta de administrador de sistemas perfectamente legítima.Respuestas:
Uno de los trucos que sigo es poner
#
al principio mientras uso elrm
comando.Esto evita la ejecución accidental de
rm
un archivo / directorio incorrecto. Una vez verificado, eliminar#
desde el principio. Este truco funciona, porque en Bash una palabra que comienza con#
hace que esa palabra y todos los caracteres restantes en esa línea sean ignorados. Entonces el comando simplemente se ignora.O
Si desea evitar cualquier directorio importante, hay un truco más.
Cree un archivo nombrado
-i
en ese directorio. ¿Cómo se puede crear un archivo tan extraño? Usandotouch -- -i
otouch ./-i
Ahora intenta
rm -rf *
:Aquí
*
se expandirá-i
a la línea de comando, por lo que su comando finalmente se convierterm -rf -i
. Por lo tanto, el comando se solicitará antes de la eliminación. Usted puede poner este archivo en su/
,/home/
,/etc/
, etc.O
Úselo
--preserve-root
como una opción pararm
. En los paquetesrm
incluidos en los más nuevoscoreutils
, esta opción es la predeterminada.O
Use safe-rm
Extracto del sitio web:
fuente
-i
archivo. Jaja Tonto bash.touch -- -rf
Tu problema:
La solución: ¡no hagas eso! Como práctica, no lo use
./
al comienzo de un camino. Las barras no agregan ningún valor al comando y solo causarán confusión../*
significa lo mismo que*
, por lo que el comando anterior se escribe mejor como:rm -rf *
Aquí hay un problema relacionado. Veo la siguiente expresión a menudo, donde alguien asumió que
FOO
está configurado para algo así/home/puppies
. Hoy vi esto en realidad, en la documentación de un importante proveedor de software.rm -rf $FOO/
Pero si
FOO
no está configurado, esto evaluará arm -rf /
, que intentará eliminar todos los archivos en su sistema. La barra diagonal final es innecesaria, por lo que, como práctica, no la use.Lo siguiente hará lo mismo y es menos probable que dañe su sistema:
rm -rf $FOO
Aprendí estos consejos por las malas. Cuando tuve mi primera cuenta de superusuario hace 14 años, corrí accidentalmente
rm -rf $FOO/
desde un script de shell y destruí un sistema. Los otros 4 administradores de sistemas miraron esto y dijeron: 'Sí. Todos lo hacen una vez. Ahora aquí está su medio de instalación (36 disquetes). Ve a arreglarlo.Otras personas aquí recomiendan soluciones como
--preserve-root
ysafe-rm
. Sin embargo, estas soluciones no están presentes para todas las variantes de Un * xe y pueden no funcionar en Solaris, FreeBSD y MacOSX. Además,safe-rm
requiere que instale paquetes adicionales en cada sistema Linux que use. Si confíasafe-rm
, ¿qué sucede cuando comienza un nuevo trabajo y no se hansafe-rm
instalado? Estas herramientas son una muleta, y es mucho mejor confiar en los valores predeterminados conocidos y mejorar sus hábitos de trabajo.fuente
rm -rf *
. Siempre cambia primero el directorio y usa un objetivo específico. La razón es que usa mucho el historial del shell, y le preocupa que tal comando en su historial pueda aparecer en el momento equivocado.rm -rf *
también eliminó.
y..
. Era root, y esto atravesó los directorios inferiores como../../..
, y fue bastante destructivo. Intento tener mucho cuidado con esorm -rf *
desde entonces.rm -rf $FOO
No ayudará si es necesariorm -rf $FOO/$BAR
.cd $FOO && rm -rf $BAR
ayudará, aunque es mucho más tiempo.${FOO:?}
, como enrm -rf ${FOO:?}/
yrm -rf ${FOO:?}/${BAR:?}
. Evitará que se traduzca enrm -rf /
. Tengo más información sobre esto en mi respuesta aquí .rm -rf *
un bucle for que cambió al directorio incorrecto por error y terminó borrando otra cosa. Si hubiera utilizado un objetivo específico, habría tenido muchas menos posibilidades de eliminar lo incorrecto.Como esto está en "Serverfault", me gustaría decir esto:
Si tiene docenas o más servidores, con un equipo bastante grande de los administradores / usuarios, alguien va a
rm -rf
ochown
el directorio equivocado.Debe tener un plan para recuperar el servicio afectado con el menor MTTR posible.
fuente
Las mejores soluciones implican cambiar sus hábitos para no usarlos
rm
directamente.Un enfoque es correr
echo rm -rf /stuff/with/wildcards*
primero. Verifique que el resultado de los comodines se vea razonable, luego use el historial del shell para ejecutar el comando anterior sin elecho
.Otro enfoque es limitar el
echo
comando a casos en los que es muy obvio lo que va a eliminar. En lugar de eliminar todos los archivos en un directorio, elimine el directorio y cree uno nuevo. Un buen método es cambiar el nombre del directorio existenteDELETE-foo
, luego crear un nuevo directoriofoo
con los permisos apropiados y finalmente eliminarloDELETE-foo
. Un beneficio adicional de este método es que el comando que se ingresó en su historial esrm -rf DELETE-foo
.Si realmente insiste en eliminar un montón de archivos porque necesita que el directorio permanezca (porque siempre debe existir o porque no tendría el permiso para volver a crearlo), mueva los archivos a un directorio diferente y elimine ese directorio .
(Presione esa tecla Alt+ .).
Eliminar un directorio desde adentro sería atractivo, porque
rm -rf .
es corto , por lo tanto, tiene un bajo riesgo de errores tipográficos. Los sistemas típicos no te permiten hacer eso, desafortunadamente. Enrm -rf -- "$PWD"
cambio, puede hacerlo, con un mayor riesgo de errores tipográficos, pero la mayoría de ellos conducen a eliminar nada. Tenga en cuenta que esto deja un comando peligroso en su historial de shell.Siempre que puedas, usa el control de versiones. Tú no
rm
, túcvs rm
o lo que sea, y eso es imposible de hacer.Zsh tiene opciones para avisarle antes de ejecutarlo
rm
con un argumento que enumera todos los archivos en un directorio: (activado de formarm_star_silent
predeterminada) solicita antes de ejecutarlorm whatever/*
yrm_star_wait
(desactivado de manera predeterminada) agrega un retraso de 10 segundos durante el cual no puede confirmar. Esto es de uso limitado si tiene la intención de eliminar todos los archivos en algún directorio, porque ya estará esperando el mensaje. Puede ayudar a prevenir errores tipográficos comorm foo *
pararm foo*
.Hay muchas más soluciones flotando que implican cambiar el
rm
comando. Una limitación de este enfoque es que un día estarás en una máquina con lo realrm
y llamarás automáticamenterm
, seguro a la espera de una confirmación ... y lo siguiente será restaurar las copias de seguridad.fuente
mv -t DELETE_ME -- *
Es un poco más infalible.rm
directamente es un buen consejo! Una alternativa aún mejor es usar elfind
comando .find somedir -type f -delete
cual eliminará todos los archivossomedir
pero dejará el directorio y todos los subdirectorios.Siempre puedes hacer un alias, como mencionaste:
También puede integrarlo con un cliente de Twitter de línea de comandos para alertar a sus amigos acerca de cómo casi se humilló al limpiar su disco duro
rm -fr /*
como root.fuente
telnet miku.acm.uiuc.edu
?Sí: no trabaje como root y siempre piense dos veces antes de actuar.
Además, eche un vistazo a algo como https://launchpad.net/safe-rm .
fuente
¡La forma más sencilla de evitar accidentes
rm -rf /*
es evitar el uso delrm
comando! De hecho, siempre he tenido la tentación de correrrm /bin/rm
para deshacerme del comando por completo. No, no estoy siendo gracioso.En su lugar, use la
-delete
opción delfind
comando , pero antes de eliminar los archivos, le recomiendo obtener una vista previa de los archivos que eliminará:Tenga en cuenta que en las versiones modernas de
find
si omite el nombre de un directorio, utilizará implícitamente el directorio actual, por lo que lo anterior es el equivalente de:Una vez que esté seguro de que estos son los archivos que desea eliminar, puede agregar la
-delete
opción:Por lo tanto, no solo es
find
más seguro de usar, también es más expresivo , por lo que si desea eliminar solo ciertos archivos en una jerarquía de directorios que coinciden con un patrón en particular, puede usar una expresión como esta para obtener una vista previa y luego eliminar los archivos:Hay muchas buenas razones para aprender y usar,
find
además de solo una más segurarm
, por lo que te agradecerás más tarde si te tomas el tiempo de aprender a usarfind
.fuente
Hay algunos consejos realmente malos en este hilo, afortunadamente la mayoría ha sido rechazada.
En primer lugar, cuando necesite ser root, conviértase en root - sudo y los diversos trucos de alias lo debilitarán. Y lo que es peor, te harán descuidado. Aprende a hacer las cosas de la manera correcta, deja de depender de los alias para protegerte. Un día obtendrás la raíz en una caja que no tiene tus ruedas de entrenamiento y explotarás algo.
Segundo: cuando tienes root, piensa en ti mismo como conducir un autobús lleno de niños en edad escolar. A veces puedes escuchar la canción en la radio, pero otras veces debes mirar a ambos lados, ralentizar las cosas y revisar todos tus espejos.
En tercer lugar - Casi nunca realmente tiene que
rm -rf
- más probable es que deseemv something something.bak
omkdir _trash && mv something _trash/
Cuarto, siempre
ls
tu comodín antesrm
: no hay nada loco en mirar algo antes de destruirlo para siempre.fuente
ls
.find
comando .find . -name '*~'
ejemplo. Mi punto es quels
enumerará el mismo globo querm
usará.Este es el estándar mío específicamente para expresiones regulares en el contexto de rm, pero en este caso te habría salvado.
Siempre hago
echo foo*/[0-9]*{bar,baz}*
primero, para ver qué coincide con la expresión regular. Una vez que tengo la salida, vuelvo con la edición de línea de comandos y cambioecho
arm -rf
. Yo nunca, nunca utilizarrm -rf
en una expresión regular no probado .fuente
*
tiene una definición muy precisa llamada Kleene Star, que es un operador unario que coincide con cero o más elementos del conjunto al que se aplica (en el caso de expresiones regulares, el carácter o conjunto de caracteres que precede al Kleene Star), mientras que al pegar los*
fósforos cualquier cosa en el patrón que sigue. Son semánticamente muy diferentes, incluso si parecen tener una sintaxis similar.La solución a este problema es realizar copias de seguridad periódicas. Cada vez que produzca algo que no quiera arriesgarse a perder, haga una copia de seguridad. Si encuentra que retroceder regularmente es demasiado doloroso, entonces simplifique el proceso para que no sea doloroso.
Por ejemplo, si trabaja en código fuente, use una herramienta como
git
para reflejar el código y mantener el historial en otra máquina. Si trabaja en documentos, tenga un script quersync
envíe sus documentos a otra máquina.fuente
Parece que la mejor manera de reducir este riesgo es tener una eliminación en dos etapas como la mayoría de las GUI. Es decir, reemplace rm con algo que mueva las cosas a un directorio de basura (en el mismo volumen). Luego, limpie esa basura después de que haya pasado suficiente tiempo para notar cualquier error.
Una de estas utilidades, trash-cli, se discute en Unix StackExchange, aquí .
fuente
rm
.Un factor clave importante para evitar este tipo de errores es no iniciar sesión con una cuenta raíz. Cuando inicia sesión con un usuario normal sin privilegios, debe usarlo
sudo
para cada comando. Entonces, deberías tener más cuidado.fuente
sudo
y las copias de seguridad. Echa un vistazo a esta página: forum.synology.com/wiki/index.php/… . Se habla de crear una papelera de reciclaje. ¡Espero que esto ayude!Cuando elimino un directorio de forma recursiva, pongo el
-r
, y-f
si corresponde, al final del comando, por ejemplorm /foo/bar -rf
. De esa manera, si accidentalmente presiono Enter demasiado pronto, sin haber escrito toda la ruta, el comando no es recursivo, por lo que es probable que sea inofensivo. Si topo Enter mientras intento escribir la barra después/foo
, he escrito enrm /foo
lugar derm -rf /foo
.Eso funciona muy bien en los sistemas que utilizan los coreutils de GNU, pero las utilidades en algunos otros Unix no permiten que las opciones se coloquen al final de esa manera. Afortunadamente, no uso tales sistemas con mucha frecuencia.
fuente
Puede ser complicado, pero puede configurar roles dentro de SELinux para que, incluso si el usuario se convierte en root a través de sudo su - (o su simple), la capacidad de eliminar archivos puede ser limitada (debe iniciar sesión directamente como root para eliminar archivos). Si está utilizando AppArmor, puede hacer algo similar .
Por supuesto, la otra solución sería asegurarse de tener copias de seguridad. :)
fuente
Evita usar globos . En Bash, puedes configurar
noglob
. Pero nuevamente, cuando se muda a un sistema dondenoglob
no está configurado, puede olvidarlo y proceder como si lo fuera.Configurado
noclobber
para evitarmv
ycp
destruir archivos también.Use un buscador de archivos para borrar. Algunos navegadores de archivos ofrecen una papelera (por ejemplo, Konqueror ).
Otra forma de evitar el engorde es un seguimiento. En la línea de comando, yo
echo filenamepattern >> xxx
. Luego edito el archivo con Vim o vi para verificar qué archivos se van a eliminar (observe los caracteres del patrón de nombre de archivo en filenmates) y luego lo uso%s/^/rm -f/
para convertir cada línea en un comando de eliminación. Fuente xxx. De esta manera, verá todos los archivos que se eliminarán antes de hacerlo.Mover archivos a un directorio 'ático' o tarball. O use el control de versiones (como dije antes que yo).
fuente
find
comando .El ZSH me pregunta (por defecto) antes de realizar una
rm -rf *
.fuente
Fuera de
chattr
, no hay muchas salvaguardas para permitir que root ejecute dicho comando. Es por eso que los grupos adecuados y los comandos cuidadosos son importantes cuando se ejecutan privilegios.La próxima vez; busque los archivos que planea eliminar: omita 'f' de
rm -rf
, o usefind
y páselo axargs rm
fuente
find
, pero recomiendo una forma más segura de usarlo en mi respuesta . No hay necesidad de usarxargs rm
ya que todas las versiones modernas defind
tienen la-delete
opción . Además, para utilizar con seguridadxargs rm
también tiene que utilizarfind -print0
yxargs -0 rm
de lo contrario tendrá problemas cuando se encuentra con cosas como nombres de archivo con espacios.find
es una buena sugerencia, sin embargo, los maticesxargs
son importantes si sugiere usarlos, de lo contrario, puede generar confusión y frustración al encontrar archivos con espacios (que se evita al usar la-delete
opción).Algunos alias de seguridad para otros comandos, para prevenir desastres similares, se encuentran aquí :
Observe las mayúsculas
-I
, es diferente de-i
:fuente
Usualmente uso la
-v
bandera para ver qué se está borrando y tengo la oportunidad de hacerlo^C
rápidamente si tengo la menor duda. Realmente no es una forma de prevenir las malasrm
, pero puede ser útil para limitar el daño en caso de que algo salga mal.fuente
Mi proceso de eliminación en máquinas basadas en Unix es el siguiente.
ls /path/to/intented/file_or_directory
en la ventana del terminal y luego presionereturn
(oTab
, según lo desee), para ver la lista de archivos.Si todo se ve bien,
haga clic en la
up arrow
tecla para volver a traerls /path/to/intented/file_or_directory
del historial del terminal.reemplace
ls
conrm
orm -r
orm -rf
, según sea necesario. Personalmente no me gusta usar la-f
bandera.Este proceso de validación también evita la ejecución prematura del
rm
comando, algo que me ha sucedido, antes de comenzar a seguir este proceso.fuente
find
que explico en mi respuesta .Si no está de humor para adquirir nuevos hábitos en este momento,
.bashrc/.profile
es un buen lugar para agregar algunas pruebas para verificar si está a punto de hacer algo estúpido. Pensé en una función Bash que podría buscar un patrón que pudiera arruinar mi día y se me ocurrió esto:Lo bueno de esto es que solo es Bash.
Claramente no es lo suficientemente genérico en esa forma, pero creo que tiene potencial, así que publique algunas ideas o comentarios.
fuente
find
comando . Además, no entiendo por qué dices "lo bueno de esto es que solo es Bash". Se recomienda evitar bash-isms en los scripts .set -f
que es equivalenteset -o noglob
en Bash, pero eso aún no explica su afirmación de que "Lo bueno de esto es que solo es Bash". En cambio, puede eliminar el problema por completo y de forma genérica para cualquier shell si no lo utilizarm
en absoluto, sino que usa elfind
comando . ¿Realmente has intentado esa sugerencia para ver cómo se compara con lo que sugieres aquí?Lamentablemente, no puedo dejar un comentario arriba debido al karma insuficiente, pero quería advertir a otros que safe-rm no es una panacea para las pesadillas accidentales de eliminación masiva.
Lo siguiente se probó en una máquina virtual Linux Mint 17.1 (advertencia para aquellos que no están familiarizados con estos comandos: ¡NO HAGA ESTO! En realidad, incluso aquellos familiarizados con estos comandos deberían / probablemente nunca harían esto para evitar la pérdida catastrófica de datos):
Versión de texto (condensada):
Versión de imagen (completa):
fuente
Me gusta el enfoque de Windows de la papelera de reciclaje.
Por lo general, creo un directorio llamado "/ tmp / recyclebin" para todo lo que necesito eliminar:
Y nunca use rm -rf, siempre uso:
Luego, más tarde, vacío la papelera de reciclaje usando un script o manualmente.
fuente
Jeje (¡no probado y algo gracioso!):
Y entonces:
Siendo realistas, debe tener una pausa mental antes de ejecutar ese tipo de operación con un glob, ya sea que esté ejecutando como root, pretendiendo "sudo", etc. Puede ejecutar un "ls" en el mismo glob, etc. pero, mentalmente, debes detenerte por un segundo, asegurarte de haber escrito lo que querías, asegurarte de que lo que quieres es realmente lo que quieres, etc. Supongo que esto es algo que se aprende principalmente destruyendo algo en el primer año como Unix SA, de la misma manera que el quemador caliente es un buen maestro para decirle que algo en la estufa puede estar caliente.
¡Y asegúrese de tener buenas copias de seguridad!
fuente
Además, no como salvaguarda, sino como una forma de averiguar qué archivos se eliminaron antes de presionar ^ C, puede usar la
locate
base de datos (por supuesto, solo si se instaló y sobreviviórm
)Lo aprendí de esta publicación de blog
fuente
Simplemente use ZFS para almacenar los archivos que necesita para resistir la eliminación accidental y tener un demonio que:
Si se eliminan los archivos, se sobrescriben, se corrompen, lo que sea, simplemente revierta su sistema de archivos a un clon de la última instantánea correcta y listo.
fuente
no tanto una respuesta sino un consejo, siempre
rm (dir) -rf
no,rm -rf (dir)
es decir: no se nuclear hasta el último momento posible.Ayuda a mitigar situaciones en las que el dedo gordo toca el nombre del directorio de tal manera que sigue siendo una eliminación válida, como deslizarse y presionar la tecla Intro.
fuente
rm
, donde las opciones deben venir antes que los nombres de archivo.Creo que este es un poderoso consejo de prevención, con * acceso directo de expansión en shell:
Primero, escriba
rm -rf *
orm -rf your/path/*
, NO escriba laEnter
clave. (por supuesto, debe tener el hábito de cuidar de no presionar Enter rápido / accidentalmente cuando lo userm -rf
)Luego, presione
Alt-Shift-8
(es decirAlt-Shift-*
) para expandir el comodín "*" explícitamente en bash. Esto también evita volver a ingresar un comando "rm -rf *" al navegar por el historial.Finalmente, después de comprobar que la expansión tiene los archivos / directorios correctos, presione Entrar.
Hecho.
fuente
En caso de que esto ayude a alguien para su propio caso:
1. Uso
rmsafe
:Mueve los archivos a una carpeta "basura" y siempre tiene la oportunidad de traerlos de vuelta con un simple
mv
:Fuente: https://github.com/pendashteh/rmsafe
2. Uso
safe
:Puede establecer un alias para
rm
usar safe:Ahora si corres
rm /*
obtienes esto en respuesta:y yo creo que no va a escribir
y
!Fuente: https://github.com/pendashteh/safe
fuente