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
Jai 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/
Commentaires
- Voulez-vous dire supprimer tous les liens symboliques liés à un dossier cible? Ou déplacer tous les liens symboliques trouvés dans un dossier spécifique?
- @uther: je veux dire supprimer les liens.
Réponse
Veuillez vous assurer de lire la réponse alternative . Cest encore plus pertinent bien que pas voté aussi haut à ce stade.
Vous pouvez utiliser ceci pour supprimer tous les liens symboliques:
find -type l -delete
avec les versions modernes de find
.
Sur les anciennes versions de recherche, il se peut que ce soit:
find -type l -exec rm {} \; # or find -type l -exec unlink {} \;
Pour se limiter à une certaine cible de lien, en supposant quaucun 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
Le if
pourrait bien sûr également inclure une condition plus complexe telle que la correspondance dun motif 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
Commentaires
- Cette commande supprime-t-elle tous les liens symboliques? Veuillez consulter ma modification ci-dessus ..
- @ Marco: oui, les trois premières lignes le feraient. Modifier davantage 🙂
- Jajouterais également un
-print
à la fin du
pour obtenir un retour visuel.
Réponse
Avec un find
moderne qui prend en charge -lname
:
find /usr/local/bin -lname "/usr/local/texlive/*" -delete
devrait faire
Commentaires
- Cest une excellente et simple solution. Jai testé et ça marche comme un charme. Merci
- Cela devrait probablement être
find /usr/local/bin
- Pas même moderne, nécessairement. GNU
find
a eu-lname
plus longtemps que je ne lai entretenu (depuis environ 2003). - @JamesYoungman: Merci! Par
find
moderne, je voulais vraiment dire GNUfind
. 😉 Jai utiliséusr/local/bin
, parce que ' est ce que lOP a utilisé.
Réponse
La solution find
est excellente.
Juste au cas où votre recherche ne serait pas « t supporte -lname
, voici une autre méthode qui utilise uniquement le shell et readlink
.
cd /usr/local/bin for f in *; do case "$(readlink "$f")" in /usr/local/texlive/*) rm "$f" ;; esac done
Réponse
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 lui-même libre de lien symbolique , cela supprimerait tous les fichiers qui, après la résolution du lien symbolique, vivraient sous /usr/local/textlive
qui incluraient des liens vers /usr/local/texlive/foo
mais aussi vers ../texlive/bar
ou vers /usr/./local/texlive/whatever
ou vers /some/other/symlink
qui est lui-même un lien symbolique pointant vers /usr/local/texlive
, etc.
Réponse
Accédez au 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
Commentaires
- Comme il sagit de chemins comme
usr/local/bin
quegrep
recherche,grep -E
est la voie à suivre. Sinon, il ny aurait pas de résultats correspondants.h
dansls
ne ' ne sert à rien ici!-h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G)
. Pour en savoir plus, consultezman ls
ouman grep
Réponse
sudo unlink /path/of/your/package
cest tout
Commentaires
- Comment cela supprime-t-il tous les liens symboliques pointant vers des cibles sous le chemin donné? Notez que la question concerne la suppression des liens symboliques dans un répertoire particulier qui pointe vers des cibles dans un autre répertoire.