Avec la commande:
ls -la *
Je peux lister tous mes liens symboliques.
Comment supprimer tous les liens symboliques liés à un dossier spécial?
Par exemple:
Dans mon répertoire usr/local/bin
J'ai les entrées suivantes:
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
Maintenant, je veux supprimer tous les liens avec le chemin /usr/local/texlive/
Veuillez vous assurer de lire la réponse alternative. C'est encore plus vrai, bien que le vote ne soit pas aussi élevé à ce stade.
Vous pouvez l'utiliser pour supprimer tous les liens symboliques:
find -type l -delete
avec les versions modernes de find
.
Sur les anciennes versions de recherche, il peut être nécessaire:
find -type l -exec rm {} \;
# or
find -type l -exec unlink {} \;
Pour limiter à une certaine cible de lien, en supposant qu'aucun des chemins ne contient de caractère de nouvelle ligne:
find -type l | while IFS= read -r lnkname; do if [ "$(readlink '$lnkname')" == "/your/exact/path" ]; then rm -- "$lnkname"; fi; done
ou bien formaté
find -type l |
while IFS= read -r lnkname;
do
if [ "$(readlink '$lnkname')" = "/your/exact/path" ];
then
rm -- "$lnkname"
fi
done
if
pourrait bien sûr également inclure une condition plus complexe telle que la correspondance d'un modèle avec grep
.
Adapté à votre cas:
find -type l | while IFS= read -r lnk; do if (readlink "$lnk" | grep -q '^/usr/local/texlive/'); then rm "$lnk"; fi; done
ou bien formaté:
find -type l | while IFS= read -r lnk
do
if readlink "$lnk" | grep -q '^/usr/local/texlive/'
then
rm "$lnk"
fi
done
Avec un find
moderne qui prend en charge -lname
:
find /usr/local/bin -lname '/usr/local/texlive/*' -delete
devrait le faire.
La solution find
est excellente.
Juste au cas où votre recherche ne prend pas en charge -lname
, voici une autre façon d'utiliser uniquement Shell et readlink
.
cd /usr/local/bin
for f in *; do
case "$(readlink "$f")" in /usr/local/texlive/*)
rm "$f"
;;
esac
done
Avec zsh
:
rm -f /usr/local/bin(@e'{[[ $REPLY:P = /usr/local/texlive/* ]]}')
$REPLY:P
résout complètement le chemin vers un chemin sans lien symbolique, donc en supposant que /usr/local/texlive
est un lien symbolique libre lui-même, il supprimerait tous les fichiers qui, après la résolution du lien symbolique, vivent sous /usr/local/textlive
qui inclurait des liens vers /usr/local/texlive/foo
mais aussi à ../texlive/bar
ou pour /usr/./local/texlive/whatever
ou pour /some/other/symlink
qui est lui-même un lien symbolique pointant dans /usr/local/texlive
, etc.
Accédez à votre chemin et définissez-vous la configuration du chemin
ls -alh|grep "your-pattern-to-file-or-folder-for-symlink"| awk '{print $9}'|xargs rm -rf