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

Com o comando:

ls -la * 

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 Eu 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/

Comentários

  • Você quer dizer remover todos os links simbólicos vinculados a uma pasta de destino? Ou mover todos os links simbólicos encontrados para uma pasta específica?
  • @uther: quero dizer, removendo os links.

Resposta

Certifique-se de ler a resposta alternativa . É ainda mais direto ao ponto, embora não tenha votado tão alto neste momento.

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

find -type l -delete 

com versões find modernas.

Em versões de localização mais antigas, pode ter que ser:

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

Para limitar a um determinado destino de link, presumindo que nenhum dos caminhos contenha qualquer 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 formatado bem

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

O if também poderia incluir uma condição mais complexa, como a correspondência de 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 formatado bem:

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

Comentários

  • Este comando remove todos os links simbólicos? Por favor, veja minha edição acima.
  • @ Marco: sim, as três primeiras linhas seriam. Editando mais 🙂
  • Eu também adicionaria um -print no final do

comando para obter algum feedback visual.

Resposta

Com um find moderno que suporta -lname:

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

deve servir .

Comentários

  • Essa é uma solução excelente e simples. Eu testei e funciona como um encanto. Obrigado
  • Presumivelmente, deve ser find /usr/local/bin
  • Nem mesmo moderno, necessariamente. GNU find teve -lname por mais tempo do que eu tenho mantido (desde cerca de 2003).
  • @JamesYoungman: Obrigado! Por moderno find eu realmente quis dizer GNU find. 😉 Usei usr/local/bin, porque isso ' é o que o OP usou.

Resposta

A find solução é ótima.

Apenas no caso de sua descoberta não suporte -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 

Resposta

Com zsh:

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

$REPLY:P resolve totalmente o caminho para um sem links simbólicos, então assumindo que /usr/local/texlive é livre de links simbólicos. , removeria todos os arquivos que, após a resolução do link simbólico, residem em /usr/local/textlive que incluiria links para /usr/local/texlive/foo, mas também para ../texlive/bar ou para /usr/./local/texlive/whatever ou /some/other/symlink que é um link simbólico apontando para /usr/local/texlive, etc.

Resposta

Vá para o caminho seu e defina você mesmo a configuração do caminho

ls -alh|grep "your-pattern-to-file-or-folder-for-symlink"| awk "{print $9}"|xargs rm -rf 

Comentários

  • Como esses são caminhos como usr/local/bin que grep está procurando, grep -E é o caminho a percorrer. Caso contrário, não haveria resultados correspondentes. Além disso, h em ls não ' serve a qualquer propósito aqui! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). Para obter mais informações, consulte man ls ou man grep

Resposta

sudo unlink /path/of/your/package

É isso

Comentários

  • Como isso remove todos os links simbólicos que apontam para destinos abaixo do caminho fornecido? Observe que a pergunta pergunta sobre a remoção dos links simbólicos em um diretório específico que aponta para destinos em algum outro diretório.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *