Verifique se a transferência de arquivos transferiu arquivos corretamente na linha de comando?

1

Então, acabei de receber um novo SSHD de 4TB e instalarei uma tecnologia na minha casa até 26 de maio de 2015. Para fazer backup de minhas coisas, comprei uma unidade externa de 4TB e decidi copiar tudo do meu computador interno. e drives de 3 TB para minha unidade de 4 TB. Obtive com sucesso o 1TB copiado, mas acidentalmente cancelei a transferência de 3 TB no meio da cópia - que eu estava usando o nautilus - e quero verificar a integridade dos arquivos, pois não sei como meu disco de 3TB foi preenchido rápido e eu só quero apagar tudo sobre ele, uma vez que eu verifiquei a integridade. Para verificar a integridade, não quero reformatar a unidade, pois tenho alguns arquivos em excesso aqui que não estão nas outras unidades. Eu quero ter um comando analisar o caminho de cada arquivo no "diretório a" como se fosse chrooted e, em seguida, verifique se o arquivo existe no "diretório b" e tem o mesmo hash e tamanho. Se o hash for diferente, o tamanho for diferente ou o arquivo não existir no "diretório b", ele copiará o arquivo novamente. Aqui está um exemplo.

Digamos que o diretório A esteja em / a e o diretório b esteja em / b. Se houver um arquivo de 500KB que tenha um caminho de /a/eevee.png, ele irá esperar que /b/eevee.png exista e seja 500KB com o mesmo hash. Se não existir, não tiver 500 KB e / ou tiver um hashsum diferente, copiará o arquivo e substituirá sem perguntar.

Além disso, um recurso opcional é isso. Se o arquivo no diretório a corresponde a um arquivo no diretório b, como afirmei anteriormente, mas o timestamp é diferente, então o arquivo no diretório b tem seu registro de data e hora alterado para o que estiver no diretório a.

    
por user245115 24.05.2015 / 23:14

2 respostas

3

Eu realmente encontrei um caminho com muita pesquisa, não fui fundo o suficiente antes de postar isso. Eu gostaria de referenciá-lo neste post aqui (nos fóruns do Ubuntu, não no Ubuntu). Usuário papibe comentou:

  

Ho jonnyboysmithy.

     

Parece um trabalho para o 'rsync'.

     

Por padrão, o rsync copia e atualiza arquivos com base no tempo de modificação   e tamanho. No entanto, você pode especificar apenas para verificar o tamanho do arquivo.

     

Por exemplo:

rsync -av --size-only  source/  destination/
     

Espero que ajude. Deixe-nos saber como vai. Atenciosamente.

    
por user245115 29.05.2015 / 03:32
2

Aqui está meu script bruto para verificar arquivos em duas pastas e, se algum arquivo tiver um problema, copie-o. Eu sugeriria usar este após copiar arquivos.

A idéia básica é usar hexdump para verificar os arquivos. O script usa dois diretórios como entradas. Limitação: Só processa os arquivos dentro do diretório, não os subdiretórios (porque ainda não sei como fazê-lo). Portanto, você pode usar isso se não tiver muitas pastas, mas se tiver várias pastas e subpastas, executar o script manualmente para cada diretório poderá ser entediante. Alimento para o pensamento futuro: crie uma lista de pastas e subpastas para origem e destino, e depois automatize o script passando pelas duas listas .

Script em ação

Eu tester2 como diretório de origem e testerdir como destino, onde eu já copiei arquivos. Na linha 123 eu corro o script para verificar os arquivos sendo copiados. Na linha 124 mudo o conteúdo do arquivo tester2 / hello (mude seu conteúdo de "TEST" para "TESTER"). Na linha 125 você pode ver que o script detecta que o arquivo hello foi alterado / alterado em tamanho / corrompido e copia o arquivo novamente. Na linha 126 você pode ver que o arquivo hello na pasta de destino corresponde ao da pasta de origem.

Script

#!/bin/bash
# Author: Serg Kolo
# Date: Mon May 25 01:19:59 MDT 2015
# Description: script to verify files in  two directories
# written for http://askubuntu.com/q/627817/295286
copy_the_file ()
{
  cp -f  "$SOURCE_DIR"/"$filename" "$DEST_DIR"/"$filename"
}


if [ $# -ne 2  ]; then
    printf "Usage: verify-files.sh  SOURCE_DIR  DEST_DIR"
    exit 1
fi

SOURCE_DIR=""
DEST_DIR=""

IFS=":"
for filename in $(find "$SOURCE_DIR" -maxdepth 1 -type f -printf "%f:" | sed 's/.\///g'   )
do

#echo "$filename"
#echo "$DEST_DIR"/"$filename"




    if [ -e "$DEST_DIR"/"$filename"   ];then
        hexdump "$SOURCE_DIR"/"$filename" > .dump1
            hexdump "$DEST_DIR"/"$filename" > .dump2
            diff .dump1 .dump2 > /dev/null
        if [ $? -eq 0  ];then
            echo " "$filename" is OK  "
        else 
            echo ""$filename" has a problem"
            copy_the_file
        fi
    else 
        copy_the_file
    fi


done
    
por Sergiy Kolodyazhnyy 25.05.2015 / 09:34