Como posso remover todos os links simbólicos com um alvo especial?

38

Com o comando:

ls -la *

Eu posso listar todos os meus links simbólicos.

Como posso remover todos os links simbólicos que estão vinculados a uma pasta especial?

Por exemplo:

No meu diretório usr/local/bin , tenho as seguintes entradas:

lrwxrwxrwx 1 root root 50 Apr 22 14:52 allneeded -> /usr/local/texlive/2011/bin/x86_64-linux/allneeded
lrwxrwxrwx 1 root root 47 Apr 22 14:52 amstex -> /usr/local/texlive/2011/bin/x86_64-linux/amstex
lrwxrwxrwx 1 root root 24 Apr 23 19:09 arara -> /home/marco/.arara/arara

Agora quero remover todos os links com o caminho /usr/local/texlive/

    
por Marco Daniel 25.05.2012 / 15:10

4 respostas

55

Por favor, leia a resposta alternativa . É ainda mais importante, apesar de não ter votado tão alto neste momento.

Você pode usar isso para excluir todos os links simbólicos:

find -type l -delete

com as modernas versões find .

Em versões mais antigas, talvez seja necessário:

find -type l -exec rm {} \;
# or
find -type l -exec unlink {} \;

Para limitar a um determinado destino de link, supondo que nenhum dos caminhos contenha nenhum caractere de nova linha:

 find -type l | while IFS= read -r lnkname; do if [ "$(readlink '$lnkname')" == "/your/exact/path" ]; then rm -- "$lnkname"; fi; done

ou bem formatado

 find -type l |
 while IFS= read -r lnkname;
 do
   if [ "$(readlink '$lnkname')" = "/your/exact/path" ];
   then
     rm -- "$lnkname"
   fi
 done

O if poderia também incluir uma condição mais complexa, como corresponder a um padrão com grep .

Feito sob medida para o seu caso:

find -type l | while IFS= read -r lnk; do if (readlink "$lnk" | grep -q '^/usr/local/texlive/'); then rm "$lnk"; fi; done

ou bem formatado:

find -type l | while IFS= read -r lnk
do
  if readlink "$lnk" | grep -q '^/usr/local/texlive/'
  then
    rm "$lnk"
  fi
done
    
por 25.05.2012 / 15:23
23

Com um find moderno que suporta -lname :

find /usr/local/bin -lname '/usr/local/texlive/*' -delete

deve fazer isso.

    
por 25.05.2012 / 17:52
5

A solução find é ótima.

Apenas para o caso de sua descoberta não suportar -lname , aqui está outra maneira que usa apenas shell e readlink .

cd /usr/local/bin
for f in *; do
  case "$(readlink "$f")" in /usr/local/texlive/*)
    rm "$f"
    ;;
  esac
done
    
por 25.05.2012 / 18:14
0

com zsh :

rm -f /usr/local/bin(@e'{[[ $REPLY:P = /usr/local/texlive/* ]]}')

$REPLY:P resolve completamente o caminho para um livre de links simbólicos, portanto, assumindo que /usr/local/texlive é symlink livre, removeria todos os arquivos que depois da resolução de links simbólicos viverem sob /usr/local/textlive , incluindo links para /usr/local/texlive/foo também para ../texlive/bar ou para /usr/./local/texlive/whatever ou para /some/other/symlink , que é um link simbólico que aponta em /usr/local/texlive , etc.

    
por 04.09.2018 / 15:58