Supprimer tous les liens symboliques avec une ligne?

Pour un dossier donné, comment puis-je supprimer tous les liens cassés?

j'ai trouvé cette réponse qui montre comment supprimer un lien brisé, mais je ne peux pas mettre cela ensemble dans une seule ligne. Y a-t-il une doublure pour ça?

Une fracture de la symbolique est un lien qui pointe vers un fichier/dossier qui n'existe plus.

36
demandé sur Community 2014-02-28 17:56:13

8 réponses

Voici une façon POSIX de supprimer tous les liens symboliques rompus dans le répertoire courant, sans récursion. Il fonctionne en disant find pour traverser des liens symboliques ( -L ), mais en s'arrêtant ( -prune ) à chaque répertoire-ou-lien-symbolique-à-tel.

find -L . -name . -o -type d -prune -o -type l -exec rm {} +

Vous pouvez également utiliser une boucle shell. Le test -L correspond aux liens symboliques, et -e correspond aux fichiers existants (à l'exclusion des liens symboliques brisés).

for x in * .[!.]* ..?*; do if [ -L "$x" ] && ! [ -e "$x" ]; then rm -- "$x"; fi; done

si vous voulez revenir en sous-répertoires, cette technique ne fonctionne pas. Avec GNU find (comme trouvé sur Linux et Cygwin non-embarqués), vous pouvez utiliser le prédicat -xtype pour détecter les liens symboliques brisés ( -xtype utilise le type de la cible pour les liens symboliques, et les rapports l pour les liens brisés).

find -xtype l -delete

POSIXly, vous devez combiner deux outils. Vous pouvez utiliser find -type l -exec … pour invoquer une commande sur chaque lien symbolique, et [ -e "$x" ] pour vérifier si ce lien n'est pas brisé.

find . -type l -exec sh -c 'for x; do [ -e "$x" ] || rm "$x"; done' _ {} +

la solution La plus simple est d'utiliser zsh. Pour supprimer tous les liens symboliques dans le répertoire courant:

rm -- *(-@D)

Les caractères entre parenthèses sont des glob qualificatifs : - déréférencer les liens symboliques, @ pour correspondre uniquement les liens symboliques (la combinaison -@ signifie brisé les liens symboliques seulement), et D match point fichiers. Pour revenir en sous-répertoires, faites rm -- **/*(-@D) .

63
répondu Gilles 2015-11-11 20:00:30

réponse simple basée sur la réponse que vous avez liée (pour un répertoire donné, $DIR ):

find -L $DIR -maxdepth 1 -type l -delete
15
répondu sanmiguel 2014-02-28 17:51:50

Réponse repose sur la accepté de répondre à la question "Comment puis-je trouver brisé les liens symboliques" :

find . -type l -! -exec test -e {} \; -print | xargs rm
5
répondu rayphi 2017-04-13 12:36:28

à Partir de man find EXEMPLES:

find -L /usr/ports/packages -type l -exec rm -- {} +

supprimer tous les liens symboliques rompus dans /usr/ports/paquets.

5
répondu Mr. Kennedy 2017-02-03 10:37:27

pour MAC , faire un essai comme suit: -

DIR=<some path>
find -L $DIR -maxdepth 1 -type l -print

Maintenant, vous pouvez tailler les vieux symlinks comme suit: -

for f in `find -L $DIR -maxdepth 1 -type l`; do unlink $f; done
2
répondu saurabheights 2017-07-21 08:42:12

vous pouvez utiliser readlink pour déterminer si un lien symbolique est brisé ou non.

la liste suivante énumérerait tous les liens symboliques rompus dans un répertoire (et sous-répertoires) donné:

find . -type l -exec sh -c 'readlink -f "{}" 1>/dev/null || echo "{}"' -- "{}" \;

remplacer echo par rm pour se débarrasser des cassés!

(j'ai redirigé la sortie de readlink vers /dev/null afin d'éviter toute confusion; il listerait la cible pour les liens symboliques.)

1
répondu devnull 2014-02-28 14:45:28

le paquet symlinks est pré-installé sur de nombreuses distributions (y compris Ubuntu 16.04 & Fedora 25) et dispose de certaines fonctionnalités vraiment utiles, dont l'une fait précisément ce que vous recherchez:

symlinks -d ./
1
répondu SamWN 2017-05-20 16:36:27

vous pouvez essayer d'utiliser rmlint .

d'abord, changez le répertoire vers le dossier qui contient les liens symboliques cassés, puis exécutez les commandes suivantes pour trouver de mauvais liens symboliques pointant nulle part :

rmlint --types="badlinks"

puis rmlint va créer un script bash rmlint.sh dans votre répertoire courant et imprimer une liste de mauvais liens symboliques dans votre terminal. Pour supprimer tous les mauvais liens symboliques dans votre répertoire, vous pouvez lancer

./rmlint.sh

Pas exactement une doublure, mais il est très facile à utiliser.

0
répondu Erdos Yi 2018-02-06 11:51:01