Saltar al contenido

Acción de comando Deshacer copiar (cp)

Estate atento porque en este escrito vas a hallar el arreglo que buscas.

Solución:

Si entiendo bien, el siguiente es el caso:

  • Copió una cantidad (presumiblemente grande) de archivos en un directorio existente y necesita/quiere revertir la acción.
  • El directorio de destino contiene una serie de otro archivos, que debe mantener allí, lo que hace que sea imposible simplemente eliminar todos archivos del directorio

El siguiente script busca 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.

los try El 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

#!/usr/bin/env python

import os

source_dir = "/path/to/source" # the folder you copied the files from
target_folder = "/path/to/destination" # the folder you copied the files to

for root, dirs, files in os.walk(source_dir):
    for name in files:
        try:
            os.remove(target_folder+"/"+name)
        except FileNotFoundError:
            pass

Cómo utilizar

  • Pegue el script en un archivo vacío, guárdelo como reverse.py,
  • Inserte las rutas correctas para la carpeta de origen y de destino,
  • Hacerlo ejecutable por razones de conveniencia,
  • Ejecútelo con el comando:

    [sudo] /path/to/reverse.py
    

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 de origen no tenga subdirectorios, el script puede ser aún más simple:

#!/usr/bin/env python

import os

source_dir = "/path/to/source" # the folder you copied the files from
target_folder = "/path/to/destination" # the folder you copied the files to

for file in os.listdir(source_dir):
    try:
        os.remove(target_folder+"/"+file)
    except FileNotFoundError:
        pass

Nota

Si la acción de copiar sobrescribió (reemplazado) un archivo con un nombre similar en el destino, el archivo se eliminará, pero el script (por supuesto) no recuperará el archivo original. La suposición es que no hay conflictos de nombres.

TL;RD:

Todos los archivos que están presentes en ambos src y dest se puede quitar de dest Me gusta esto:

find . -maxdepth 1 -type f -exec cmp -s '' "$destdir/" ; -exec mv -n "$destdir/" "$toDelete"/ ;

Para obtener una explicación paso a paso, consulte a continuación.

Simplificando el problema:

Para comprender qué hizo realmente el comando que queremos deshacer, empecemos por simplificarlo:

El comando que queremos deshacer es

sudo cp From_SOURCE/* To_DESTINATION/

Para entender cómo deshacer, sudo no es relevante.

Usaré los nombres de los directorios src por From_SOURCE y dest por To_DESTINATION.

Ahora, nuestro comando es:

cp src/* dest/

Si src contiene los archivos f1, f2 y f3y los directorios d1 y d2el shell expande ese comando a:

cp src/f1 src/f2 src/f3 src/d1 src/d2 dest/

Sin opciones como -r, -R o -aEl comando cp no copia directorios.
Eso significa que el comando los dejará fuera, mostrando un error para cada uno de ellos:

$ cp src/f1 src/f2 src/f3 src/d1 src/d2 dest/
cp: omitting directory 'src/d1'
cp: omitting directory 'src/d2'

Eso significa que solo hemos copiado archivos simples, y no directorios, a dest.

Decidir qué archivos eliminar:

Posiblemente había archivos en dest del mismo nombre que los archivos en src. 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.

Así que buscamos estos archivos:

Primero nosotros cd dentro srcporque hace lo siguiente find comandos mucho más simples, y establezca una variable en la ruta absoluta de dest:

$ cd src
$ destdir="$(readlink -f dest)"

Luego, enumeramos todos los archivos en src:

$ find . -maxdepth 1 -type f

y, para cada archivo encontrado, utilice cmp para verificar si hay un archivo con el mismo contenido en dest:

$ find . -maxdepth 1 -type f -exec cmp -s '' "$destdir/" ; -print

Eliminando los archivos, con cuidado:

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:

$ toDelete=/tmp/toDelete ; mkdir -p "$toDelete"
$ find . -maxdepth 1 -type f -exec cmp -s '' "$destdir/" ; -exec echo mv -n "$destdir/" "$toDelete"/ ;
mv -n /path/to/dest/./f1 /tmp/toDelete/`
mv -n /path/to/dest/./f2 /tmp/toDelete/`
mv -n /path/to/dest/./f3 /tmp/toDelete/`

¡Se ve bien! Ahora podemos dejar de lado el echo para ejecutar el verdadero mv comandos:

find . -maxdepth 1 -type f -exec cmp -s '' "$destdir/" ; -exec mv -n "$destdir/" "$toDelete"/ ;

Todos los archivos de dest que fueron copiados de srcy todavía en realidad lo mismo en src y destahora están en /tmp/toDelete/y se puede quitar después de echar un último vistazo.


Notas:
(1) Compruebe si cp es un alias para cp -i más o menos, eso habría evitado sobrescribir archivos preguntando primero.

Esto es viejo, pero solo quería publicar una respuesta pura de bash:

Primero cambie al directorio donde copió los archivos.

cd dest

Luego, ls el directorio de origen y canalice la salida a rm

ls source | xargs rm

Sección de Reseñas y Valoraciones

Acuérdate de que tienes la capacidad de valorar esta sección si te fue preciso.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *