Qualquer maneira de sincronizar a estrutura de diretórios quando os arquivos já estão em ambos os lados?

0

Eu tenho duas unidades com os mesmos arquivos, mas a estrutura de diretórios é totalmente diferente.

Existe alguma maneira de "mover" todos os arquivos no lado do destino para que eles correspondam à estrutura do lado da fonte? Com um script, talvez?

Por exemplo, a unidade A possui:
/foo/bar/123.txt
/foo/bar/234.txt
/foo/bar/dir/567.txt

Considerando que a unidade B possui:
/some/other/path/123.txt
/bar/doo2/wow/234.txt
/bar/doo/567.txt

Os arquivos em questão são enormes (800 GB), então não quero copiá-los novamente; Eu só quero sincronizar a estrutura, criando os diretórios necessários e movendo os arquivos.

Eu estava pensando em um script recursivo que encontraria cada arquivo de origem no destino e, em seguida, movê-lo para um diretório correspondente, criando-o, se necessário. Mas isso está além das minhas habilidades ...

Qualquer ajuda muito apreciada!

Obrigado

    
por Ze'ev 25.01.2011 / 02:35

1 resposta

2

Dado que seus nomes de arquivos são únicos, isso funcionará, ainda que lentamente:

#!/bin/sh

src=$1
tgt=$2

# Iterate over all the filenames in the source directory.
(cd $src && find . -type f -print) | while read src_path; do
    src_dir=$(dirname "$src_path")
    src_base=$(basename "$src_path")

    # find the file on the target with the same name.
    tgt_path=$(find $tgt -name "$src_base")

    # skip to next file if there's no matching filename
    # in the target directory.
    [ "$tgt_path" ] || continue

    # create the destination directory and move the file.
    mkdir -p "$tgt/$src_dir"
    mv "$tgt_path" "$tgt/$src_dir"
done

Note que (a) não há muita verificação de erros acontecendo aqui, (b) vai demorar um pouco se você tiver muitos arquivos, e (c) como escrito, isso provavelmente deixará muitos diretórios vazios no alvo.

Aqui está meu teste limitado. Com um diretório de origem que parece isso:

$ find src -type f
src/b/file2.txt
src/a/file1.txt
src/c/file3.txt

E um diretório de destino com esta aparência:

$ find tgt -type f
tgt/file1.txt
tgt/file2.txt
tgt/not/the/right/place/file3.txt

Se eu tiver o script acima em um arquivo chamado reorg.sh e executá-lo como isso:

$ sh reorg.sh src tgt

Acabo com um diretório de destino que se parece com isso:

$ find tgt -type f
tgt/b/file2.txt
tgt/a/file1.txt
tgt/c/file3.txt
    
por 26.01.2011 / 16:22