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
try
elemento 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.remove
conprint
, 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
src
ydest
se pueden eliminar dedest
esta 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,
sudo
no es relevante.Usaré los nombres de directorio
src
paraFrom_SOURCE
ydest
paraTo_DESTINATION
.Ahora, nuestro comando es:
Si
src
contiene los archivosf1
,f2
yf3
, y los directoriosd1
yd2
, el shell expande ese comando para:Sin opciones como
-r
,-R
o-a
, el comandocp
no 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
dest
el 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,
cd
ensrc
, porque hace que los siguientesfind
comandos 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
cmp
para 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
echo
de ejecutar losmv
comandos reales :Todos los archivos desde
dest
que fueron copiados desrc
, y todavía en realidad la misma ensrc
ydest
, ahora están en/tmp/toDelete/
, y pueden ser removidos después de tomar una última mirada.Notas:
(1) Verifique si
cp
es un aliascp -i
o 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 dest
Luego,
ls
el directorio de origen y canalizar la salida enrm
ls source | xargs rm
fuente
ls
suele ser una mala idea. mywiki.wooledge.org/ParsingLs No rechazaré su publicación, pero hay que tenerla en cuenta.