Copié algún archivo de la carpeta de origen en la carpeta de destino usando la siguiente línea de comando en la terminal.
sudo cp From_SOURCE/* To_DESTINATION/
Ahora quiero deshacer este comando.
command-line
cp
αғsнιη
fuente
fuente

From_SOURCE/*y eliminarlos deTo_DESTINATION/; esto podría hacerse con bash: los problemas aquí podrían incluir que el comando cp sobrescribió cualquier cosa, se copiaron enlaces simbólicos, archivos con espacios en los nombres, etc., por lo que podría tener problemas y volverse un poco loco. Una opción 'deshacer' perfecta podría tener que dar cuenta de muchas cosas.Respuestas:
Si entiendo bien, el siguiente es el caso:
El siguiente script se ve en el directorio original (fuente) y enumera esos archivos. Luego, busca en el directorio en el que copió los archivos y elimina solo los archivos enumerados, tal como existen en el directorio de origen.
El
tryelemento se agrega para evitar errores, por ejemplo, en caso de que ya haya eliminado algunos archivos manualmente, o si no todos los archivos del directorio de origen se copiaron en el destino. Si necesita privilegios de sudo, simplemente ejecute el script con "sudo" (ver más abajo).La secuencia de comandos
Cómo utilizar
reverse.py,Ejecútelo con el comando:
Advertencia
¡Primero intente en un directorio de prueba si entendí bien lo que necesita lograr!
Si el directorio fuente es "plano"
En caso de que el directorio fuente no tenga subdirectorios, el script puede ser incluso más simple:
Nota
Si la acción de copiar sobrescribió (reemplazó) un archivo con un nombre similar en el destino, el archivo se eliminará, pero el archivo original (por supuesto) no será recuperado por el script. La suposición es que no hay enfrentamientos de nombres.
fuente
sudo python3 reverse.py. Acepto tu respuestacp.cp -r. Cambiéos.removeconprint, y está generando un montón de archivos que no existen. Supongo que faltan los subdirectorios y solo enumero los archivos al final.TL; DR:
Todos los archivos que están presentes en ambos
srcydestse pueden eliminar dedestesta manera:Para una explicación paso a paso, ver más abajo.
Simplificando el problema:
Para comprender qué hizo realmente el comando que queremos deshacer, comenzamos por simplificarlo:
El comando que queremos deshacer es
Para entender cómo deshacer,
sudono es relevante.Usaré los nombres de directorio
srcparaFrom_SOURCEydestparaTo_DESTINATION.Ahora, nuestro comando es:
Si
srccontiene los archivosf1,f2yf3, y los directoriosd1yd2, el shell expande ese comando para:Sin opciones como
-r,-Ro-a, el comandocpno copia directorios.Eso significa que el comando los dejará fuera, mostrando un error para cada uno de ellos:
Eso significa que solo hemos copiado archivos simples, y no directorios, a
dest.Decidir qué archivos eliminar:
Posiblemente había archivos con
destel mismo nombre que los archivossrc. En este caso, los archivos se sobrescribieron (1). Es demasiado tarde para ellos, lo siento. Recuperarlos de la última copia de seguridad.Con respecto a los archivos que están allí, queremos eliminar solo los archivos que se han copiado. Estos archivos existen en ambos directorios, con el mismo nombre y el mismo contenido.
Entonces buscamos estos archivos:
En primer lugar,
cdensrc, porque hace que los siguientesfindcomandos mucho más simples, y establecer una variable en la ruta absoluta del dest:Luego, enumeramos todos los archivos en src:
y, para cada archivo encontrado, use
cmppara verificar si hay un archivo con el mismo contenido en dest:Eliminando los archivos, cuidadosamente:
Estos archivos son los que queremos eliminar. Pero para estar seguros, primero los movemos a un directorio diferente, y echamos un vistazo a los comandos antes de ejecutarlos:
¡Se ve bien! Ahora podemos dejar
echode ejecutar losmvcomandos reales :Todos los archivos desde
destque fueron copiados desrc, y todavía en realidad la misma ensrcydest, ahora están en/tmp/toDelete/, y pueden ser removidos después de tomar una última mirada.Notas:
(1) Verifique si
cpes un aliascp -io no, eso habría evitado sobrescribir archivos preguntando primero.fuente
Esto es antiguo, pero solo quería publicar una respuesta bash pura:
Primero cambie al directorio donde copió los archivos.
cd destLuego,
lsel directorio de origen y canalizar la salida enrmls source | xargs rmfuente
lssuele ser una mala idea. mywiki.wooledge.org/ParsingLs No rechazaré su publicación, pero hay que tenerla en cuenta.