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

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

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

#!/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)предложение.

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

Связанный контент