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 try
elemento é 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 src
e dest
podem ser removidos dest
assim:
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, sudo
não é relevante.
Usarei os nomes dos diretórios src
for From_SOURCE
e dest
for To_DESTINATION
.
Agora, nosso comando é:
cp src/* dest/
Se src
contiver os arquivos f1
, f2
e f3
, e os diretórios d1
e d2
, o shell expandirá esse comando para:
cp src/f1 src/f2 src/f3 src/d1 src/d2 dest/
Sem opções como -r
ou -R
, -a
o comando cp
nã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 dest
com 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 cd
em src
, porque torna os find
comandos 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 cmp
para 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 echo
para executar os mv
comandos reais:
find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec mv -n "$destdir/{}" "$toDelete"/ \;
Todos os arquivos dest
que foram copiados de src
e ainda são iguais em src
e dest
agora estão em /tmp/toDelete/
e podem ser removidos após uma última olhada.
Notas:
(1) Verifique se cp
há um alias cp -i
ou 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, ls
o 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_list
e 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_list
os rm -rf
arquivos/pastas não necessários e salve-os.
Então faça:
source file_list