4

Я ищу инструмент, сценарий оболочки или другую программу для синхронизации двух или более папок или дисков.

Но он отличается от инструмента rsync, потому что я не хочу дублировать отсутствующий файл, но сделаю символическую ссылку на него в другой папке, например:

Если в папке A у нас есть файлы a и b и другая папка c с файлом d:

A

a

б

с

d

И в папке B у нас есть файл 1 и папка 2 с файлом 3:

В

1

2

3

Я хотел бы, чтобы программа, например, ssync (символическая синхронизация, просто имя изобретения), вызываемая командой, например, ssync /A /B, изменила эти папки, как показано ниже:

A

a

б

с

d

1 (ln -s)

2 (ln -s)

3 (ln -s)

а также

В

1

2

3

a (ln -s)

b (ln -s)

c (ln -s)

d (ln -s)

где ln -s указывает, что в этой папке была создана символическая ссылка на этот соответствующий файл, например, (ln -s) указывает, что была использована команда ln -s /A /a /B /a .

Может произойти другое, если файл и ссылка имеют одно и то же имя, ссылка также должна автоматически иметь другое имя ...

Я буду очень признателен, если кто-нибудь поможет мне. Благодарю.

1 ответ1

1

Как Arcege ответит мне в Unix & Linux, ответ будет ниже.

Спасибо очень Arcege !

Если кто-то немного улучшит этот скрипт, пожалуйста, оставьте ответ тоже =).

Попробуй это:

#!/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

Это не обрабатывает "специальные" файлы, такие как блочные устройства, именованные каналы, сокеты и т.д.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .