Idéalement, j'aimerais une commande comme celle-ci
rm --only-if-symlink link-to-file
car je me suis brûlé trop de fois en supprimant accidentellement le fichier au lieu du lien symbolique pointant vers le fichier. Cela peut être particulièrement mauvais lorsque sudo est impliqué. Maintenant, je fais bien sûr un ls -al
pour m'assurer qu'il s'agit bien d'un lien symbolique et autres, mais cela est vulnérable aux erreurs de l'opérateur (fichier de même nom, faute de frappe, etc.) et aux conditions de concurrence (si quelqu'un voulait que je supprime un fichier pour une raison quelconque). Existe-t-il un moyen de vérifier si un fichier est un lien symbolique et de le supprimer uniquement s'il se trouve dans une seule commande?
bash
command-line
rm
Shelvacu
la source
la source
Réponses:
la source
!
et de le remplacer||
par&&
||
forme.&&
fait baisser les choses si vous êtes enset -e
mode.[ ! -L $1 ]
), en utilisant un opérateur non valide ([ ! -l foo ]
), ou même erreur de syntaxe ([ ! -q foo || echo foo
)rm_if_link(){ [ -L "$1" ] && rm -v "$1"; }
est que l'exécuter sur unset -e
mode non- link va tuer votre processus shell. Vous pouvez ajouter|| :
mais cela devient, à mon humble avis, encore moins clair que la! ||
version, et cela empêchera unerm
panne de vous tuerset -e
, ce qui est probablement indésirable.! ||
est assez concis et clair, et ne souffre d'aucun de ces problèmes.rm
intérieur de votre test, b) utilisez une instruction if réelle, c) ne faites pas le tour en utilisant-e
des shells interactifs (et testez vos scripts!). Si vous voulez discuter de la lisibilité, utiliserif
pour tester si quelque chose est un lien est clairement le gagnant.Vous pouvez utiliser
find
et sa-type l
condition de test (qui teste pour voir si l'objet trouvé est une encre l ou non)Par exemple, si vous avez un fichier appelé
foo
dans le répertoire courant, vous pouvez faire ceci:Vous pourriez être en mesure de simplifier cela avec juste:
Ce qui supprimerait tous les liens symboliques dans le répertoire courant.
Attention:
L'
-delete
optionfind
est vraiment très dangereuse. ASSUREZ-VOUS DE LE PLACER À LA FIN DE LA COMMANDE FIND. Si vous le perdez, il supprimera tout ce qu'il trouvera, que les résultats correspondent ou non à votre condition.Comme suggéré dans les commentaires, une option plus sûre peut être d'utiliser
find
etrm -i
(ce qui vous oblige à confirmer la suppression du fichier) en conjonction:Personnellement, j'utilise
-exec trash {} \;
pour supprimer temporairement des fichiers, parce que, comme vous, j'ai été brûlé parrm
le passé. Double va pour un-delete
drapeau mal placé .http://slackermedia.ml/trashy
la source
find . -type l -iname "foo" | xargs rm -i
c'est plus sûr.rm -i
Pour la sécurité, bien sûr.-print0
pourfind
et-0
pourxargs
.@
est un qualificatif glob ; le motiffoo(@)
correspond à ce quifoo
correspond, mais seulement les liens symboliques.foo(-@)
ne correspondrait qu'à des liens symboliques rompus.foo(@,L0)
correspondrait uniquement aux liens symboliques et aux fichiers vides.Bien sûr, si vous utilisez zsh en premier lieu, il vous suffit de taper
rm foo(@)
. Vous devez faire attention à ne pas appuyer Enteravant de taper(@)
.la source