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

43

Com o comando:

ls -la *

Eu posso listar todos os meus links simbólicos.

Como posso remover todos os links simbólicos 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 eu quero remover todos os links com o caminho /usr/local/texlive/

Marco Daniel
fonte
1
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?
George M
@uther: quero dizer remover os links.
Marco Daniel

Respostas:

63

Leia a resposta alternativa . É ainda mais direto ao ponto, embora não tenha sido votado tão alto neste momento.

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

find -type l -delete

com findversões modernas .

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, assumindo 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 bem formatado

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

É ifclaro que também poderia incluir uma condição mais complexa, como combinar um padrão com grep.


Adaptado ao 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
0xC0000022L
fonte
Este comando remove todos os links simbólicos? Por favor, veja minha edição acima ..
Marco Daniel
@ Marco: sim, as três primeiras linhas. Editando mais :)
0xC0000022L
Eu também adicionaria um -printno final do findcomando para obter algum feedback visual.
usar o seguinte
30

Com um moderno findque suporta -lname:

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

deve fazê-lo.

Christoffer Hammarström
fonte
1
Essa é uma solução excelente e simples. Eu testei e funciona como um encanto. Obrigado
Marco Daniel
Presumivelmente isso deveria ser #find /usr/local/bin
James Youngman
1
Nem mesmo moderno, necessariamente. O GNU findtem -lnamemais tempo do que eu o tenho mantido (desde 2003).
James Youngman
@JamesYoungman: Obrigado! Por moderno findeu realmente quis dizer GNU find. ;) Eu usei usr/local/bin, porque é isso que o OP usou.
Christoffer Hammarström
5

A findsolução é ótima.

Caso sua descoberta não seja compatível -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
Mikel
fonte
1

Com zsh:

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

$REPLY:Presolve completamente o caminho para um link sem link simbólico, supondo que /usr/local/texliveele próprio seja livre de /usr/local/textlivelinks simbólicos, ele removeria todos os arquivos que, após a resolução do link simbólico, permanecerem sob os quais incluiriam links para /usr/local/texlive/foomas também para ../texlive/barou para /usr/./local/texlive/whateverou para os /some/other/symlinkquais é um link simbólico apontando /usr/local/texlive, etc. .

Stéphane Chazelas
fonte
0

Vá para o caminho do seu e defina-se a configuração do caminho

ls -alh|grep "your-pattern-to-file-or-folder-for-symlink"| awk '{print $9}'|xargs rm -rf
wallance
fonte
Uma vez que estes são caminhos como usr/local/binque grepestá procurando, grep -Eé o caminho a percorrer. Caso contrário, não haveria resultados correspondentes. Também hem lsnão serve qualquer propósito aqui! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). Para mais ver man lsouman grep
ss_iwe