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.
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)
.
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
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
à Partir de man find
EXEMPLES:
find -L /usr/ports/packages -type l -exec rm -- {} +
supprimer tous les liens symboliques rompus dans /usr/ports/paquets.
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
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.)
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.