¿Tenemos un deshacer en Linux?

Respuestas:

53

Linux (como otros unices) no proporciona de forma nativa una función de deshacer. La filosofía es que si se fue, se fue. Si era importante, debería haber sido respaldado.

Hay un sistema de archivos de fusibles que guarda automáticamente copias de versiones antiguas: copyfs , disponibles en todas las distribuciones buenas. Por supuesto, eso puede usar muchos recursos.

La mejor manera de protegerse contra tales accidentes es usar un sistema de control de versiones (cvs, bazar, darcs, git, mercurial, subversion, ...). Toma un poco de tiempo aprender, pero vale la pena a mediano y largo plazo.

Gilles 'SO- deja de ser malvado'
fuente
1
una buena alternativa podría ser gitfs, que está en desarrollo
test30
1
Bueno si accidentalmente eliminar o sobrescribir un archivo que no lo hizo el escenario o comprometerse aún entonces incluso un CVS no ayuda
xdevs23
14

Lamentablemente no.

postfuturista
fuente
19
No sé si considero esto desafortunado ... Se necesitarían bastantes recursos para implementar un deshacer. Ni siquiera me gusta la -iopción rmactivada por defecto. Mis sistemas Unix no deberían tomar mi mano.
xenoterracide
55
-i está habilitado por defecto ?! No es mi distribución, no señor!
Stefan
9

No, no hay un deshacer mágico en ningún Unix. Unix asume que sabes lo que estás haciendo. Para deshacer el soporte, use un VCS (su editor de texto probablemente también lo tenga incorporado)

La mayoría de los sistemas de archivos no tienen la capacidad de hacerlo de manera transparente.

Time Machine y la restauración del sistema en Mac y Windows respectivamente son solo sistemas de copia de seguridad / control de cambios.

xenoterracida
fuente
7

No hay deshacer en la línea de comando. Sin embargo, puede ejecutar comandos como rm -iy mv -i. Esto te indicará con un "¿estás seguro?" pregunta antes de que ejecuten el comando.

También es posible agregar un alias a un script de inicio (por ejemplo, ~/.bashrco /etc/bash.bashrc):

alias remove='rm -i'
alias move='mv -i'

Editar: según las sugerencias a continuación, eliminé mi consejo para alias los comandos predeterminados. En cambio, ahora introduce nuevos comandos).

vdboor
fuente
1
+1. solo para agregar aquí. Después de configurar los alias anteriores, si en algunos casos desea eliminar directamente sin el aviso "¿está seguro?", Puede usar \ rm y \ mv para omitir el alias. También puede usar la opción -f.
Hemant
2
mv -isolo pregunta cuándo sobrescribiría un archivo (lo que lo hace útil y no desagradable). En la misma línea, alias cp='cp -i'.
Gilles 'SO- deja de ser malvado'
8
Aliasing rm y mv es una muy mala idea. (rm es lo peor de todo). Nunca tenga el hábito de usar rm para referirse a rm -i: eventualmente lo usará en algún lugar donde el alias no esté definido y eliminará algo para siempre. Si le gusta que se le solicite, tenga la costumbre de usar rm -i todo el tiempo.
msakr
Si le gusta que se le solicite, use un alias con un nombre diferente. Uso move = 'mv -i', copy = 'cp -i', symlink = 'ln -si' e instalo un comando de papelera para usar en lugar de rm. Todavía uso mv, cp y rm directamente cuando escribo, pero para uso interactivo estos alias son útiles.
@mahmoudsakr Tienes toda la razón, perdí ese punto. No tengo estos comandos con alias tampoco. ¡Aliasarlos como un comando diferente parece ser la opción más sensata!
vdboor
4

La razón por la que los sistemas Linux / Unix no tienen una recuperación se debe a la forma en que la mayoría de los sistemas de archivos almacenan su información. La metainformación del archivo se almacena en la parte frontal del disco con referencias a inodes en el resto del disco. Por lo general, la mayoría de los sistemas de archivos asignan 10 bloques a un archivo en esta metaárea. Los primeros 7 se refieren a los primeros 7 inodes. El octavo y noveno van a listas de inodos (bloques doblemente vinculados) y el décimo va a una lista de listas de listas (bloques triplicados). Esto varía de un sistema de archivos a otro (ext4, jfs, xfs, etc.), pero estas listas de bloques generalmente pueden abordar tamaños de archivo de 2GB a varios TB.

Pero debido a que toda esta información se almacena en la parte frontal del disco, cuando se borra un archivo, no hay forma de hacer referencia a los inodos en el disco a qué metadatos pertenecen. En contraste, FAT32 y NTFS realmente almacenan cierta información de encabezado con los archivos mismos, lo que facilita identificar a qué archivo pertenece un conjunto de bloques (siempre y cuando ese espacio no haya sido reclamado por los archivos más nuevos todavía). En el trabajo de Linux, cuando elimina algo, casi siempre es lo primero que se sobrescribe de inmediato con nuevos datos para mayor eficiencia.

djsumdog
fuente
2

Si realmente desea una función de deshacer, use el control de origen. Subversion realmente funciona muy bien en una sola máquina de usuario. Lo uso para controlar todos mis archivos personales en mi sistema doméstico. Parece una exageración, hasta el desastre, un script falso o un error tipográfico en la línea de comando.

Stephen Jazdzewski
fuente
1
Sin rm -r .embargo , no te protegerá . ;)
Umang
1
@Umang En realidad lo hice una vez con git, donde guardo un repositorio local y accidentalmente rm -r project.git. Afortunadamente si mantiene otra versión en un servidor remoto que es poco probable que suceda
phunehehe
1
@phunehehe y quien hizo +1 en mi comentario: estamos demasiado acostumbrados a DVCS para darnos cuenta de que estaba completamente equivocado. SVN se compromete con el repositorio (que no es la rama). Así que va a ser realmente protegido rm -r .. Realmente estúpido de mi parte.
Umang
2

Una cosa que me gusta agregar a mi .bashrc es una función de copiar y quitar. Algo como:

cprm(){
    cp -p $1 ~/deleted/$1
    rm $1
}

Pero debe acostumbrarse a escribir cprm, no rm.

Obviamente, deberá mantenerse al tanto del área eliminada si tiene un espacio en disco limitado.


fuente
44
realmente podría acortar eso a mv $ 1 ~ / eliminado / $ 1
Stefan
Sí, y va a sobrescribir un archivo 'nuevo Documento 1' con otro 'nuevo Documento 1', si obtiene el derecho de citar: "$1".
usuario desconocido
@userunknown: ¿quiere decir que $ 1 en el código de Deano y Stefan debería ser "$ 1"?
Tim
@Tim: Sí, lo hago.
usuario desconocido
¿Por qué no mover en lugar de cp y rm?
user1559897