Se você tem o GNU ou o BSD find
, isso deve ser feito:
find -lname '/home/Steven/*' -delete
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".
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
.
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:
@
glob que corresponde a links simbólicos: 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
.