Мне нужна помощь в написании скрипта для создания символических ссылок. Вот скрипт, который я запустил в фоновом режиме.
#!/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
Теперь я хотел бы, чтобы этот скрипт выполнял еще пару задач.
- Игнорировать уже связанные папки и
папки с префиксом «old.». Удалите символическую ссылку из $DEST, если основная папка недоступна в $SOURCE.
Пожалуйста, помогите мне добавить эти функции в этот скрипт. Спасибо.
решение1
Я знаю, что это может быть более громоздко, чем вы ожидали, но я бы переписал эту -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)
предложение.
Надеюсь это поможет.