Назад | Перейти на главную страницу

Как мне написать сценарий, который сравнивает имена папок / символических ссылок из двух разных папок?

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

#!/bin/bash
SOURCE="/home/$USER/www"
DEST="/var/www"
while true; do
    find $SOURCE -maxdepth 1 -type d -not -name "old.**" -exec ln -s -- {} "$DEST"/{} \;
    find $DEST -maxdepth 1 -type l -exec test ! -e {} \; -delete
sleep 30
done

Теперь я бы хотел, чтобы этот скрипт выполнял еще пару задач.

Пожалуйста, помогите мне добавить эти функции в этот скрипт. Спасибо.

Я знаю, что это может быть более громоздко, чем вы ожидали, но я бы переписал -exec ... часть как отдельный скрипт, который получает один входной параметр (имя каталога для символической ссылки), а затем проверяет, существует ли уже символическая ссылка (например, if [ -h "$DEST/$1" ] ...) и, при необходимости, разрешается ли оно в правильное место (например, if [ $(readlink $DEST/$1) == $SOURCE/$1 ] .... Если оба условия верны, мы пропускаем файл, в противном случае символическая ссылка создается (повторно).

Затем вы вызываете этот сценарий в классе exec следующим образом: find $SOURCE -maxdepth 1 -type f -not -name "old.**" -exec make-symlink.sh {} \;

Еще пара моментов:

  • Имена файлов, find заменит вместо {} будет включать $SOURCE: например в вашем случае окончательный exec команда будет выглядеть так: ln -s -- /home/user/www/public /var/www/home/user/www/public. Решите эту проблему, используя basename.

  • в некоторых системах (OS X) сам каталог $ SRC будет включен в список каталогов find находит. Вероятно, это не то, что вам нужно. Решите эту проблему, удалив первую строку find вывод или добавлением -not -name $(basename $SOURCE) пункт.

Надеюсь это поможет.