Copiei algum arquivo da pasta de origem para a pasta de destino usando a linha de comando abaixo no terminal.
sudo cp From_SOURCE/* To_DESTINATION/
Agora eu quero desfazer este comando.
command-line
cp
αғsнιη
fonte
fonte
From_SOURCE/*
e removê-losTo_DESTINATION/
; isso pode ser feito com o bash - os problemas aqui podem incluir o comando cp, substituindo qualquer coisa, links simbólicos foram copiados, arquivos com espaços em nomes etc. - para que ele possa ter problemas e ficar um pouco maluco. Uma opção perfeita de "desfazer" poderia ser responsável por muitas coisas.Respostas:
Se bem entendi, é o seguinte:
O script abaixo procura no diretório original (fonte) e lista esses arquivos. Em seguida, ele analisa o diretório para o qual você copiou os arquivos e remove apenas os arquivos listados, pois 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 de sudo, basta executar o script com "sudo" (veja abaixo).O script
Como usar
reverse.py
,Execute-o pelo comando:
Atenção
Primeiro tente um diretório de teste se eu 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:
Nota
Se a ação de copiar overwrote (substituído) um arquivo de 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 nome.
fonte
sudo python3 reverse.py
. Eu aceito sua resposta.cp
.cp -r
. Eu mudeios.remove
comprint
, e ele está produzindo um monte de arquivos que não existem. Suponho que esteja faltando os subdiretórios e listando apenas os arquivos no final.TL; DR:
Todos os arquivos que estão presentes nos dois
src
edest
podem ser removidosdest
assim:Para uma explicação passo a passo, veja abaixo.
Simplificando o problema:
Para entender o que o comando que queremos desfazer realmente fez, começamos por simplificá-lo:
O comando que queremos desfazer é
Para entender como desfazer,
sudo
não é relevante.Vou usar os nomes de diretório
src
paraFrom_SOURCE
edest
paraTo_DESTINATION
.Agora, nosso comando é:
Se
src
contém os arquivosf1
,f2
ef3
, e os diretóriosd1
ed2
, o shell expande esse comando para:Sem opções como
-r
,-R
ou-a
, o comandocp
não copia diretórios.Isso significa que o comando os deixará de fora, mostrando um erro para cada um deles:
Isso significa que apenas copiamos arquivos simples e nenhum diretório para
dest
.Decidindo quais arquivos remover:
Possivelmente havia arquivos com
dest
o mesmo nome que arquivossrc
. Nesse caso, os arquivos foram substituídos (1). É tarde demais para eles, desculpe. Recupere-os do backup mais recente.Em relação aos arquivos existentes, queremos remover apenas os arquivos que foram copiados. Esses arquivos existem nos dois diretórios, com o mesmo nome e o mesmo conteúdo.
Então, procuramos esses arquivos:
Primeiro,
cd
emsrc
, porque faz as seguintesfind
comandos muito mais simples, e definir uma variável para o caminho absoluto do dest:Em seguida, listamos todos os arquivos no src:
e, para cada arquivo encontrado, use
cmp
para verificar se há um arquivo com o mesmo conteúdo em dest:Removendo os arquivos, com cuidado:
Esses arquivos são os que queremos remover. Mas para ter certeza, nós os movemos para um diretório diferente primeiro - e examinamos os comandos antes de executá-los:
Parece bom! Agora podemos deixar
echo
de executar osmv
comandos reais :Todos os arquivos
dest
copiadossrc
e ainda os mesmos emsrc
edest
agora estão em/tmp/toDelete/
e podem ser removidos depois de uma última olhada.Notas:
(1) Verifique se
cp
há um alias maiscp -i
ou menos, que teria evitado sobrescrever arquivos perguntando primeiro.fonte
Isso é antigo, mas eu só queria postar uma resposta pura do bash:
Primeiro mude para o diretório em que você copiou os arquivos.
cd dest
Em seguida,
ls
o diretório de origem e canalize a saída pararm
ls source | xargs rm
fonte
ls
normalmente é uma má ideia. mywiki.wooledge.org/ParsingLs Não vou votar contra sua postagem, mas ela deve ser observada.