Preciso de ajuda para escrever um script para criar links simbólicos. Aqui está um script que estou executando em segundo plano.
#!/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
Agora gostaria que este script executasse mais algumas tarefas.
- Ignore as pastas já vinculadas e
as pastas com 'antigo'. prefixo. Remova o link simbólico de $DEST se a pasta principal não estiver disponível em $SOURCE.
Por favor, ajude-me a adicionar essas funcionalidades neste script. Obrigado.
Responder1
Eu sei que isso pode ser mais complicado do que você esperava, mas eu reescreveria a -exec ...
parte como um script separado que obtém um parâmetro de entrada (o nome do diretório para o qual o link simbólico) e, em seguida, verifica se o link simbólico já existe (por exemplo if [ -h "$DEST/$1" ] ...
) e, se necessário , se ele resolve para um local correto (por exemplo if [ $(readlink $DEST/$1) == $SOURCE/$1 ] ...
. Se ambas as condições forem verdadeiras, ignoramos o arquivo, caso contrário, o link simbólico é (re)criado.
Então você chama esse script na classe exec assim:
find $SOURCE -maxdepth 1 -type f -not -name "old.**" -exec make-symlink.sh {} \;
Mais alguns pontos:
Os nomes dos arquivos que
find
serão substituídos no lugar de{}
será incluído$SOURCE
: por exemplo, no seu caso, oexec
comando final ficará assim:ln -s -- /home/user/www/public /var/www/home/user/www/public
. Resolva esse problema usandobasename
.em alguns sistemas (OS X), o próprio diretório $SRC será incluído na lista de diretórios
find
encontrados. Provavelmente não é isso que você deseja. Resolva este problema removendo a primeira linha dafind
saída ou adicionando-not -name $(basename $SOURCE)
uma cláusula.
Espero que isto ajude.