Como escrevo um script que compara nomes de pastas/links simbólicos de duas pastas diferentes?

Como escrevo um script que compara nomes de pastas/links simbólicos de duas pastas diferentes?

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 findserão substituídos no lugar de{} será incluído$SOURCE: por exemplo, no seu caso, o execcomando final ficará assim: ln -s -- /home/user/www/public /var/www/home/user/www/public. Resolva esse problema usando basename.

  • em alguns sistemas (OS X), o próprio diretório $SRC será incluído na lista de diretórios findencontrados. Provavelmente não é isso que você deseja. Resolva este problema removendo a primeira linha da findsaída ou adicionando -not -name $(basename $SOURCE)uma cláusula.

Espero que isto ajude.

informação relacionada