Мне нужна помощь в написании скрипта для создания символических ссылок. Вот сценарий, который я запускал в фоновом режиме.
#!/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)
пункт.
Надеюсь это поможет.