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


17

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

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

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

Hubo un mensaje que no se pudo eliminar algún directorio y salí del comando. La pregunta es: ¿qué he estado eliminando?

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


44
Bueno, al menos tengo una estrategia de respaldo ... No se ha hecho ningún daño real.
GUI Junkie

2
Bueno saber; Tengo una política de nunca usar a -rmenos que quiera deshacerme de todo.
ish

3
Como nota al margen, rm -r *~ .eliminaría todos los archivos y carpetas (en el directorio actual) que coincidan *~o .. ( .sería ignorado rmcomo una excepción especial, ya que la mayoría de la gente no quiere eliminar recursivamente el directorio actual. Esto *~elimina todos los archivos y directorios en el directorio actual que terminan en ~, pero no los archivos y directorios en subdirectorios del directorio actual. ) Entonces eso no es lo que hubieras querido. Probablemente hubiera querido usar findcon el -execindicador para mirar recursivamente a través del árbol de directorios y eliminar no recursivamente cada archivo que termina en ~.
Eliah Kagan

@EliahKagan, supongo que sí, pero encontrar con -exec siempre es una molestia. Sin embargo, restaurar el directorio de inicio es más complicado :-)
GUI Junkie

1
Informativo: cantar el ~personaje sin escapar (así \~:) hará que Bash, ZSH, etc. (el rmcomando básicamente) piense que te refieres al directorio de inicio.
Thomas Ward

Respuestas:


31

¡Has eliminado (casi) todo tu directorio de inicio!

rm -r something elimina recursivamente archivos y directorios en / debajo de algo ; solo fallará en los elementos que no tiene 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 agregó -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 tales accidentes.

Nota: Wiki de la comunidad, todos pueden contribuir.

  • Para algunos archivos, use la -iopción 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 se elimina de un directorio actual, agregue el prefijo a ./para evitar eliminar por error una ubicación diferente .:

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

    Lo anterior fue para demostrar el uso de ./. Si hay un subdirectorio, por supuesto, también puede usarlo rm -v something/*~. Cuidado : no piense que rm ./.*elimina todos los archivos ocultos en el directorio actual. Consulte esta pregunta de Serverfault para obtener soluciones sobre el ocultamiento de archivos ocultos.

  • Mover en lugar de eliminar: en lugar de eliminar archivos de forma recursiva en primer lugar, me acostumbré a mover los archivos de los que quiero deshacerme 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 obtener una vista previa si desea eliminar de forma recursiva los archivos seleccionados. Deberías tratar de hacer que esto sea algo raro, pero si tienes que ...

    1. findsin argumentos enumera recursivamente todos los archivos / directorios bajo el actual. Debería intentar buscar man findcómo hacerlo selectivo (un tesoro), pero si no quiere molestarse, puede usar el familiar greppara 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. Entonces escribo find | grep example, lo que me da estos 20 archivos. Eso se ve bien, así que ahora voy y elimino esos archivos exactos, junto con la rm -vsalida detallada mencionada anteriormente, a través de xargs:
      encontrar | ejemplo grep | xargs rm -v
      lo que me da esta salida. Este tipo de problemas impide la vista preliminar, donde dicen, se hace un error tipográfico y escribir sampleen lugar de example.

La solución anterior no debe usarse si puede tener nombres de archivo que contengan espacios, caracteres de tabulación, líneas nuevas o comillas ( "o '), ya que esto conducirá xargsa un error o se alimentará rmcon nombres de archivo incompletos, que en el peor de los casos podrían terminar eliminando el incorrecto archivos. La forma segura de hacer lo anterior es hacerlo todo con findlos operadores y las acciones.

Lo siguiente mostrará todos los archivos que contienen la palabra example

find . -name "*example*"  

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

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

Consulte Uso de Buscar para obtener más ayuda con el uso find.


1
La findsalida de tuberías grepy xargs rmes peligrosa.
geirha

2
@izx: agregado mv(mi comando favorito);)
Takkat

1
Al menos agregaría un ejemplo de uso findseguro, uno que no se rompa (y potencialmente elimine los archivos incorrectos) si los nombres de archivo contienen espacio, tabulación, nueva línea "o 'caracteres. Por ej find . -name "*example*" -exec rm -v {} +. mywiki.wooledge.org/UsingFind
geirha

1
@geirha: ¿ find -deletepor qué es tan peligroso? Hubiera dicho algo aquí, pero no sé más que lo que encontré y borré recientemente a /pesar de una ejecución en seco sin opción, -deletesolo encontré algunos archivos que quería eliminar. Veo que me recomiendan en su -exec rmlugar.
Takkat

3
@Takkat -deleteno es peligroso, y puedes usarlo de forma segura en lugar de hacerlo -exec rm {} +. Generalmente prefiero usar herramientas y características estándar cuando sea posible. -deletees una extensión GNU no estándar, findpor lo que funcionará bien en Ubuntu, pero puede que no en otros sistemas.
geirha

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.