forçar a cópia de um diretório inicial corrompido

7

Eu tenho um diretório home em um disco que tem muitos arquivos corrompidos. Eu estou tentando salvar a maioria dos arquivos possível. Eu estou tentando criar um backup do meu diretório home em uma unidade externa usando

tar -cvf backup /home/myHome

e também tentou

rsync -vfh /home/myHome /media/backup

Ambos os métodos param quando encontraram um arquivo corrompido. Existe uma maneira de forçar um ou outro a continuar copiando e ignorando arquivos inválidos, copiando tudo o que é possível copiar e mostrando um log no final dos arquivos que não foram copiados?

Obrigado.

    
por SpaceDog 22.01.2012 / 20:55

5 respostas

3

Eu escrevi um pequeno roteiro para isso

#!/bin/bash
echo "copying from $1"

find $1 -type f -print0 | while read -d $'
#!/bin/bash
echo "copying from $1"

find $1 -type f -print0 | while read -d $'%pre%' -r file ; do
    echo Processing "$file"
    target="$2""$file"
    if (test -f "$target") then
        echo File Exists:  "$target"
    else
        echo copying to "$target"
        targetDir='dirname "$target"'

        if (! [ -d "$targetDir" ]) then
            mkdir "$targetDir"
        fi

        ddrescue -e0 -r0 -v -n "$file" "$target"
        if ([ $? -ne 0 ]) then
            echo Copy failed, deleting "$target"
            rm -f "$target"
        fi
    fi
done
' -r file ; do echo Processing "$file" target="$2""$file" if (test -f "$target") then echo File Exists: "$target" else echo copying to "$target" targetDir='dirname "$target"' if (! [ -d "$targetDir" ]) then mkdir "$targetDir" fi ddrescue -e0 -r0 -v -n "$file" "$target" if ([ $? -ne 0 ]) then echo Copy failed, deleting "$target" rm -f "$target" fi fi done
    
por 19.09.2012 / 09:22
3

Se você tiver espaço suficiente em sua unidade externa, faça uma cópia completa da partição, pulando setores irrecuperáveis. Em seguida, faça uma cópia da cópia e chame fsck sobre isso.

Para a cópia da partição da unidade com falha, use myrescue , ou se isso não for flexível o suficiente ddrescue ou dd_rescue . Todas essas ferramentas ignoram regiões ilegíveis ou tentam lê-las repetidamente; ajustar, dependendo se as leituras repetidas têm uma chance de funcionar (por exemplo, mídia ótica ou disquetes) ou, ao contrário, desgastar a unidade com falha mais cedo (por exemplo, a maioria das falhas do disco rígido). Consulte também salvar dados de uma unidade com falha , < href="https://unix.stackexchange.com/questions/14560/how-to-recover-data-from-a-bad-sd-card/14577#14577"> Como recuperar dados de um cartão SD incorreto ?

sudo myrescue /dev/sda42 >/media/backup/home.raw
cp /media/backup/home.raw /media/backup/home.recovering
/sbin/fsck -f /media/backup/home.recovering
sudo mount -o loop /media/backup/home.recovering /mnt
cp -a /mnt /media/backup/home.saved
    
por 23.01.2012 / 02:13
1

Primeiro, use rsync -aHv --- rsync -vfh não faz sentido para o que você está tentando fazer.

O rsync tem um sinalizador --ignoring-existing que você pode usar. Execute rsync -aHv --ignore-existing até sair com um erro de E / S. Anote o nome do arquivo que falhou e crie uma versão vazia dele na unidade externa em que ele teria sido copiado se o rsync tivesse funcionado. Execute novamente o comando rsync e --ignore-existing fará com que ele não tente copiar o arquivo que falhou. Espero que o rsync copie todo o resto, mas se ele parar novamente, repita esse processo. Repita até que o rsync seja executado até a conclusão.

    
por 22.01.2012 / 22:35
1

Uma solução diferente:

find /home/user -type f -print0 | xargs -0 -JXXX -n1 rsync --relative -lptgoHv XXX /external-disk

find gera uma lista de arquivos e xargs chamadas rsync com eles um por vez. --relative garante que você obtenha uma árvore no disco externo em vez de um diretório simples, portanto, não deixe esse argumento para rsync .

    
por 23.01.2012 / 00:09
0

use o comando cpio -ivd -H tar

página man diz que

Isso recuperará os arquivos arquivados no arquivo directory.cpio e os colocará no diretório atual. A opção '-i' extrai o arquivo e o '-v' mostra os nomes dos arquivos à medida que são extraídos. Se você está lidando com uma árvore de diretórios arquivada, você precisa usar a opção '-d' para criar diretórios conforme necessário,

-H é para o formato

veja este e this

    
por 22.01.2012 / 22:29