Como copio uma partição ignorando erros?

0

Eu tinha um disco com muitos erros de superfície que usei até alguns dias atrás quando adquiri meu novo ssd. Eu quero saber como eu poderia copiar completamente a partição da minha home, mas ignorar todos os erros enquanto isso, pois provavelmente tem algumas centenas de clusters ruins no começo e literalmente levaria horas apenas clicando em "ignorar" no gparted. Por favor pessoal, eu tenho uns 85gb lá que seria uma dor absoluta para recriar ou copiar manualmente todos os arquivos e corrigir as permissões de.

    
por sbergeron 18.09.2014 / 21:17

3 respostas

1

Para copiar os arquivos em um diretório "flat"

Se for possível para o script criar pelo menos uma lista de arquivos, mas deve ignorar os problemas que podem ocorrer ao copiá-los, isso deve funcionar.

No caso de duplicatas, ele salvará as duplicatas como duplicate_1_<filename> , duplicate_2_ 'etc.

Eu usei:

try
    <copy_command>
except Exception
    pass

Que abrange o maior intervalo possível de erros.

O script:

#!/usr/bin/env python3

import shutil
import os

sourcedir = "/path/to/source"
dest_dir = "/path/to/destination"

for root, dirs, files in os.walk(sourcedir):
    for name in files:
        subject = root+"/"+name
        n = 1; name_orig = name
        while os.path.exists(dest_dir+"/"+name):
            name = "duplicate_"+str(n)+"_"+name_orig
            n = n+1
        try:
            newfile = dest_dir+"/"+name
            shutil.copy(subject, newfile)
        except Exception:
            pass

Copie-o para um arquivo vazio, salve-o como giveit_ashot.py e defina o sourcedir e o destino.

Execute:

python3 /path/to/giveit_ashot.py

B. Se a estrutura do diretório é importante

use o script abaixo, ele primeiro tenta (re) criar os diretórios (de cima para baixo), então copia os arquivos na estrutura o máximo possível. Novamente: deve pelo menos ser possível criar uma lista de arquivos / diretórios.

#!/usr/bin/env python3

import shutil
import os

sourcedir = "/path/to/source"
dest_dir = "/path/to/destination"

dirdata = []
filedata = []

for root, dirs, files in os.walk(sourcedir):
    for dir in dirs:
        absolute = root+"/"+dir
        relative = absolute.replace(sourcedir, "")
        dirdata.append([absolute, dest_dir+relative, len(absolute.split("/"))])
    for file in files:
        abs_file = root+"/"+file
        rel_file = abs_file.replace(sourcedir, "") # source
        filedata.append((abs_file, dest_dir+rel_file)) # destination

dirdata.sort(key=lambda x: x[2])

for item in dirdata:
    try:
        if not os.path.exists(item[1]):
            os.mkdir(item[1])
    except Exception:
        pass

for item in filedata:
    try:
        shutil.copy(item[0], item[1])
    except Exception:
        pass
    
por Jacob Vlijm 18.09.2014 / 22:52
0

gparted sugere que você esteja criando / formatando a partição. Não é o que você tem a sua casa, espero.

Se a partição já estiver criada, tente formatar com:

mkfs.ext4 -c  /dev/sdXX

Certifique-se de colocar o /dev/sdXX correto.

Se você está tentando copiar de uma partição ruim para uma boa, não sei como cp se comportaria diante de erros de IO.

    
por manu 18.09.2014 / 21:27
0

Você precisa tomar medidas diferentes para

  1. conserta blocos ruins (alguns sistemas de arquivos, como ext4 e ext3 permitem isso, info at man e2fsck )
  2. copiando os erros de ignorar (sua pergunta inicial), por exemplo com rsync -a --ignore-errors /path/to/mountpoint/of/broken/device/ /path/to/folder/on/working/device/

Observação: Você pode querer criar uma imagem da partição com dd antes de sobrescrevê-la ou descartá-la (novas ferramentas de recuperação podem surgir em algum momento e obter mais dados do disco do que atual e as dicas (meu incluído) você começa a restaurar os arquivos podem estar errados), por exemplo do sudo dd if=/dev/sdxY | pigz -p 8 | sudo tee /path/to/a/file/on/a/working/disk.img.gz para uma imagem compactada.

    
por Karl Richter 19.09.2014 / 21:41