Como sincronizar dois discos (ou pastas) usando links simbólicos (ou hard) (como o rsync)?

4

Estou pesquisando uma ferramenta ou um script de shell ou outro programa para sincronizar duas ou mais pastas ou discos.

Mas difere da ferramenta rsync, pois, não quero duplicar o arquivo perdido, mas faço um link simbólico dele na outra pasta, por exemplo:

Se na pasta A temos os arquivos a e b e outra pasta c com um arquivo d :

A

a

b

c

d

  

E na pasta B temos o arquivo 1 e uma pasta 2 com um arquivo 3 :

B

1

2

3

  

Eu gostaria de programa, por exemplo, ssync (sincronização simbólica, apenas um nome de invenção), chamado por um comando, por exemplo, ssync / A / B para alterar essas pastas, como mostrado abaixo:

A

a

b

c

d

         

1 (ln -s)

         

2 (ln -s)

         

3 (ln -s)

  

e

B

1

2

3

         

a (ln -s)

         

b (ln -s)

         

c (ln -s)

         

d (ln -s)

  

onde ln -s indica que nesta pasta foi criado um link simbólico para esse arquivo correspondente, por exemplo, a (ln -s ) indica que o comando ln -s / A / a / B / a foi usado.

Outra coisa pode acontecer, se o arquivo e o link tiverem o mesmo nome, o link deve ter um nome diferente automaticamente ...

Eu apreciarei muito se alguém me ajudar. Obrigado.

    
por GarouDan 17.10.2011 / 01:38

1 resposta

1

Como Arcege me responde em Unix & Linux a resposta está abaixo.

Thx muito Arcege !

Se alguém melhorar um pouco mais este script, por favor poste uma resposta também =).

Tente isto:

#!/bin/sh
srcdir="$1"
dstdir="$2"
if [ -h "$srcdir" ]; then
    val='readlink "$srcdir"'
    if [ ! -h "$dstdir" ]; then
        rm -rf "$dstdir"
    fi
    ln -s "$val" "$dstdir"
elif [ -d "$srcdir" ]; then
    if [ ! -d "$dstdir" ]; then
        rm -rf "$dstdir"
    fi
    mkdir "$dstdir"
    for i in 'ls -1A "$srcdir"'; do
        $0 "$srcdir/$i" "$dstdir/$i"
    done
    touch -a -r "$srcdir" "$dstdir"
    touch -m -r "$srcdir" "$dstdir"
else
    if [ ! -f "$dstdir" ]; then
        rm -rf "$dstdir"
    fi
    ln "$srcdir" "$dstdir"
fi

Isso não lida com arquivos "especiais" como dispositivos de bloco, pipes nomeados, soquetes, etc.

    
por 18.10.2011 / 12:24