Desfazer ação do comando copiar (cp)

Desfazer ação do comando copiar (cp)

Copiei alguns arquivos da pasta de origem para a pasta de destino usando a linha de comando abaixo no terminal.

sudo cp From_SOURCE/* To_DESTINATION/

Agora quero desfazer este comando.

Responder1

Se bem entendi, o seguinte é o caso:

  • Você copiou um número (presumivelmente grande) de arquivos para um diretório existente e precisa/deseja reverter a ação.
  • O diretório de destino contém váriosoutroarquivos que você precisa manter lá, o que torna impossível simplesmente removertodosarquivos do diretório

O script abaixo procura no diretório original (fonte) e lista esses arquivos. Em seguida, ele examina o diretório para o qual você copiou os arquivos e remove apenas os arquivos listados, pois eles existem no diretório de origem.

O tryelemento é adicionado para evitar erros, por exemplo, caso você já tenha removido alguns arquivos manualmente ou se nem todos os arquivos do diretório de origem foram copiados para o destino. Se você precisar de privilégios sudo, simplesmente execute o script com “sudo” (veja abaixo).

O roteiro

#!/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

Como usar

  • Cole o script em um arquivo vazio, salve-o como reverse.py,
  • Insira os caminhos corretos para a pasta de origem e de destino,
  • Torne-o executável por motivos de conveniência,
  • Execute-o pelo comando:

    [sudo] /path/to/reverse.py
    

Aviso

Primeiro tente em um diretório de teste se entendi bem o que você precisa alcançar!


Se o diretório de origem for "plano"

Caso o diretório de origem não possua subdiretórios, o script pode ser ainda mais simples:

#!/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

Observação

Se a ação de cópiasobrescrever(substituído) por um arquivo com nome semelhante no destino, o arquivo será removido, mas o arquivo original (é claro) não será trazido de volta pelo script. A suposição é que não há conflitos de nomes.

Responder2

DR:

Todos os arquivos que estão presentes em ambos srce destpodem ser removidos destassim:

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

Para uma explicação passo a passo, veja abaixo.

Simplificando o problema:

Para entender o que realmente fez o comando que queremos desfazer, começamos simplificando-o:

O comando que queremos desfazer é

sudo cp From_SOURCE/* To_DESTINATION/

Para entender como desfazer, sudonão é relevante.

Usarei os nomes dos diretórios srcfor From_SOURCEe destfor To_DESTINATION.

Agora, nosso comando é:

cp src/* dest/

Se srccontiver os arquivos f1, f2e f3, e os diretórios d1e d2, o shell expandirá esse comando para:

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

Sem opções como -rou -R, -ao comando cpnão copia diretórios.
Isso significa que o comando irá deixá-los de fora, mostrando um erro para cada um deles:

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

Isso significa que copiamos apenas arquivos simples, e nenhum diretório, para dest.

Decidindo quais arquivos remover:

Possivelmente havia arquivos destcom o mesmo nome dos arquivos src. Neste caso, os arquivos foram sobrescritos (1). É tarde demais para eles, desculpe. Recupere-os do backup mais recente.

Em relação aos arquivos que estão lá, queremos remover apenas os arquivos que foram copiados. Esses arquivos existem em ambos os diretórios, com o mesmo nome e o mesmo conteúdo.

Então procuramos estes arquivos:

Primeiro, entramos cdem src, porque torna os findcomandos a seguir muito mais simples e define uma variável para o caminho absoluto de destino:

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

Então, listamos todos os arquivos em src:

$ find . -maxdepth 1 -type f

e, para cada arquivo encontrado, use cmppara verificar se existe algum arquivo com o mesmo conteúdo em dest:

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

Removendo os arquivos, com cuidado:

Esses arquivos são os que queremos remover. Mas, para ter certeza, primeiro os movemos para um diretório diferente - e damos uma olhada nos comandos antes de executá-los:

$ 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/`

Parece bom! Agora podemos deixar de lado echopara executar os mvcomandos reais:

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

Todos os arquivos destque foram copiados de srce ainda são iguais em srce destagora estão em /tmp/toDelete/e podem ser removidos após uma última olhada.


Notas:
(1) Verifique se cphá um alias cp -iou algo assim, que teria evitado a substituição de arquivos perguntando primeiro.

Responder3

Isso é antigo, mas eu só queria postar uma resposta pura:

Primeiro mude para o diretório onde você copiou os arquivos.

cd dest

Em seguida, lso diretório de origem e canaliza a saída pararm

ls source | xargs rm

Responder4

Esta é uma resposta baseada no carimbo de data/hora da operação de cópia. Você pode listar o conteúdo da pasta em ordem de criação e canalizá-lo para um arquivo:

ls -alt | file_list

Em seguida, abra file_liste encontre os arquivos com o mesmo carimbo de data/hora das operações de cópia. Presumivelmente, estes serão os arquivos mais recentes.

Em seguida, edite file_listos rm -rfarquivos/pastas não necessários e salve-os.

Então faça:

source file_list

informação relacionada