¿Qué ha hecho 'rm -r ~' en mi directorio personal?

16

gedit crea archivos de copia de seguridad ocultos que terminan con '~'. Quería hacer una limpieza recursiva de mi árbol de directorios.

El comando rm *~ eliminará todos los archivos locales que terminen en '~'

Pensé que rm -r *~ . eliminaría todos los archivos en todo el árbol, pero escribí typo-ed rm -r ~ .

Había un mensaje que decía que no se podía eliminar el directorio y salí del comando. La pregunta es: ¿Qué he estado borrando?

Noté que mi configuración de Filezilla había desaparecido. ¿Este comando elimina todos los directorios ocultos del directorio de inicio?

    
pregunta GUI Junkie 29.06.2012 - 08:48

2 respuestas

31

¡Has eliminado (casi) todo tu directorio personal!

rm -r something recursivamente elimina los archivos y directorios en / debajo de algo ; solo fallará en los elementos que no tenga permiso para eliminar, ya sea porque son propiedad de un usuario diferente (por ejemplo, root ) o porque están en uso (por ejemplo, un montaje GVFS).

Si no agrega -f (como en, rm -rf something ), obtendrá algo como:

rm: remove write-protected regular file ‘something’?
rm: descend into write-protected directory ‘something’?

En este punto puede abortar y probablemente se dé cuenta de que ejecutó el comando incorrecto.

Sugerencias de la comunidad sobre cómo evitar dichos accidentes

  

Nota: Wiki de la comunidad, todos pueden contribuir.

  • Para algunos archivos, use la opción -i para obtener una confirmación sobre la eliminación de archivos o directorios:

    $ rm -ri something/
    rm: remove regular file ‘something/file~’? y
    rm: descend into directory ‘something’? y
    rm: remove regular file ‘something/file’? y
    rm: remove directory ‘something’? y
    
  • Si lo elimina de un directorio actual, póngalo por un ./ para evitar equivocadamente eliminar una ubicación diferente.:

    $ cd something
    $ rm -v ./*~
    removed ‘./file~’
    

    Lo anterior fue para demostrar el uso de ./ . Si hay un subdirectorio, también puedes usar rm -v something/*~ . Cuidado: no creo que rm ./.* elimine todos los archivos ocultos en el directorio actual. Consulte esta pregunta de Serverfault para buscar soluciones en los archivos ocultos globbing.

  • Mover en lugar de eliminar: en lugar de eliminar archivos recursivamente en primer lugar, me acostumbré a move los archivos que quiero eliminar en otro lugar antes de eliminarlos finalmente. Si algo salió mal es fácil de restaurar.

    mv -b SOURCE DEST
    
  • Use find (posiblemente con grep ) para vista previa si desea eliminar recursivamente los archivos seleccionados. Debería intentar que esto ocurra de forma rara, pero si tienes que ...

    1. find sin argumentos enumera recursivamente todos los archivos / directorios bajo el actual. Debería intentar buscar man find sobre cómo hacer que sea selectivo (un tesoro oculto), pero si no quiere molestarse, puede simplemente usar el familiar grep para filtrar los archivos que desea eliminar.
    2. Supongamos que soy un hacker de kernel uber-l33t, y me molestan los pocos KB de archivos "de ejemplo" en mi árbol fuente; Quiero eliminar todos los archivos que contengan eso en el nombre. Así que escribo find | grep example , que me da estos 20 archivos. Eso se ve bien, así que ahora voy a eliminar esos archivos exactos , junto con la salida verbosa rm -v mencionada anteriormente, a través de xargs :
      find | grep example | xargs rm -v
      lo que me da esta salida. Dicha vista previa evita problemas donde, digamos, se genera un error tipográfico y se escribe sample en lugar de example .

La solución anterior no se debe usar si puede tener nombres de archivos que contengan espacios, tabuladores, líneas nuevas o comillas ( " o ' ), ya que esto provocará que xargs falle o alimente rm con nombres de archivo incompletos, que en el peor de los casos podría terminar eliminando los archivos incorrectos. La forma segura de hacer lo anterior es hacerlo todo con los operadores y las acciones de find .

A continuación, se muestran todos los archivos que contienen la palabra example

find . -name "*example*"  

Si esa lista son los archivos que desea eliminar, use la acción -exec para pasar los archivos a rm .

find . -name "*example*" -exec rm -v {} +

Consulte Using Find para obtener más ayuda con el uso de find .

    
respondido por el Lekensteyn 13.04.2017 - 12:14
5

Sí. Un carácter de tilde sin comillas como argumento separado se expande a tu hogar. Entonces rm -r ~ se expandió a rm -r /home/yourusename . Entonces le dijiste a rm que elimine recursivamente todos los archivos en tu hogar.

Consulte enlace para obtener más información sobre cómo funciona la expansión de tilde.

    
respondido por el geirha 29.06.2012 - 08:57

Lea otras preguntas en las etiquetas