Chaque fois que je rm
multiplie les éléments à la fois avec l'éclatement de la coquille et qu'il y a même la moindre possibilité que le motif se développe plus que je ne le pense, j'essaie toujours de m'en souvenir -i
, mais (bien sûr) je pourrais oublier et emporter accidentellement quelque chose d'utile. Certaines personnes essaient de résoudre ce problème avec un alias, comme alias rm='rm -i'
mais je déteste l'idée de rendre rm toujours interactif, car alors j'aurai l'habitude de l'utiliser -f
tout le temps, ce qui va évidemment à l'encontre de l'objectif.
Ce que j'aimerais faire, c'est de rm
ne l'utiliser que -i
lorsque j'utilise la globalisation, et -f
bien sûr de passer outre -i
, afin que je puisse encore emporter des répertoires entiers avec l'habituel rm -rf junk
.
Par conséquent, ce rm *blah*
serait vraiment, rm -i *blah*
mais rm blah
fonctionnerait exactement comme tapé.
Au cas où il y aurait une différence dans la façon dont cela pourrait être accompli dans différents shells, je choisirai une réponse qui fournit des méthodes pour bash et zsh plutôt que des réponses qui ne couvrent que l'un ou l'autre.
Remarque : je ne suis pas vraiment convaincu que ce soit nécessairement une bonne idée; Je demande juste si c'est possible. Si vous pensez que c'est une idée stupide, je serais très heureux d'entendre le raisonnement derrière votre opinion, mais veuillez ne pas poster de tels commentaires dans le champ de réponse . Les vraies réponses me disent comment faire cela ou expliquent cela / pourquoi cela n'est pas possible (ou peut-être offrent une méthode alternative pour obtenir un résultat similaire). Mais si vous voulez me dire pourquoi c'est stupide, veuillez poster un commentaire. Je voterai pour des commentaires bien motivés même si je ne suis pas d'accord avec la conclusion.
rm -I
c'est comme-i
ça qui ne se déclenche que lorsque plus de trois fichiers ou-r
sont passés. Dansbash
, utilisez leCtrl-x *
raccourci clavier pour développer le glob et inspectez-le vous-même.noglob
par exemple, d'aliaser rm ennoglob my-rm
, puis d'avoir my-rm comme un script qui vérifie un glob, le développe et passe -i ou non. Pas sûr, je ne sais pas zsh.myrm
et laisser ce script faire les choses merveilleuses que vous aimez.Réponses:
Ce n'est pas facile. Le problème est que lorsque vous faites:
rm ne voit que la liste des fichiers, pas le modèle de globalisation qui a déjà été développé par le shell.
Ce que vous pourriez faire est (zsh):
Cela indique à zsh que les modèles ne doivent pas être développés lors de l'appel de rm. Ensuite, vous pouvez redéfinir rm comme une fonction qui fait l'expansion elle-même et ajoute le "-i" si besoin est quelque chose comme:
Le problème avec cette approche est que ce nouveau "rm" ne voit pas la différence entre
et
Pour supprimer le fichier appelé
*
, vous devez l'écrire:la source
Fonctionne en bash, probablement dans d'autres coquilles. Placer dans votre
.bashrc
la source
command rm
pour éviter le codage en durPATH
. De plus, l'approche consistant à vérifier le nombre d'arguments est un peu peu fiable, car ellerm
peut prendre des options.\rm
$1
entre guillemets doubles, mais vous avez tort sur l'échappement de la commande. La citation supprime uniquement les alias, PAS la recherche de fonction. Cette réponse suggère une fonction, pas un alias.