Remover links simbólicos originários de um diretório específico

2

Eu tenho um "install.sh" que instala meus scripts pessoais:

find /home/Steven -name '*.sh' -exec ln -s -t /usr/local/bin {} +

Gostaria de criar um "uninstall.sh" que remova os links simbólicos criados por "install.sh". Eu escrevi isso:

for z in /usr/local/bin/*
do
  if [ -h "$z" ]
  then rm "$z"
  fi
done

mas remove todos os links simbólicos, não apenas aqueles em que o alvo está abaixo "/ home / Steven".

    
por Steven Penny 28.10.2017 / 18:42

3 respostas

3

Se você tem o GNU ou o BSD find , isso deve ser feito:

find -lname '/home/Steven/*' -delete
    
por 28.10.2017 / 18:52
1

Você pode modificar seu script e usar grep e readlink ou realpath para extrair os arquivos no subdiretório desejado, por exemplo:

for z in /usr/local/bin/*
do
  if [ -h "${z}" ] && readlink -f "${z}" | grep -q '^/home/Steven'
      then rm "${z}"
  fi
done

O comando readlink -f retorna o caminho completo para o arquivo apontado pelo link simbólico. O comando grep -q '^/home/Steven' retornará verdadeiro se o caminho começar com a subcadeia '/ home / Steven' e retornar o contrário.

Uma palavra de cautela: há alguma ambigüidade relacionada aos links simbólicos que podem afetar o resultado aqui. O comando readlink -f resolverá o link de forma recursiva, portanto, o comando acima falhará se o arquivo no diretório /home/Steven for um ponto de link simbólico fora desse diretório. Se esse não for o comportamento desejado, convém usar o comando realpath .

    
por 28.10.2017 / 18:55
1

Para cobrir o caso em que os links podem ser relativos e para verificar se o caminho canônico está dentro de /home/Steven , com zsh :

rm /usr/local/bin/*(@e{'[[ $REPLY:A = /home/Steven/* ]]'})

Onde:

  • Qualificador @ glob que corresponde a links simbólicos:
  • Qualificador de e{code} glob que corresponde com base na avaliação do código (em que $REPLY contém o caminho do arquivo a ser verificado)
  • $REPLY:A expande para o caminho absoluto de $REPLY .
por 28.10.2017 / 23:24