Cada vez que rm
multiplico varios elementos a la vez con un globo de caparazón e incluso existe la más mínima posibilidad de que el patrón se expanda más de lo que esperaba, siempre trato de recordar agregar -i
, pero (por supuesto) podría olvidar y eliminar accidentalmente algo útil. Algunas personas intentan resolver este problema con un alias, como, alias rm='rm -i'
pero odio la idea de hacer que rm sea siempre interactivo, porque entonces tendré el hábito de usarlo -f
todo el tiempo, lo que obviamente anulará todo el propósito.
Lo que me gustaría hacer es rm
usarlo solo -i
cuando uso globbing y, por -f
supuesto -i
, anularlo , por lo que aún puedo volar directorios completos con lo habitual rm -rf junk
.
Por rm *blah*
lo tanto , realmente sería, rm -i *blah*
pero rm blah
funcionaría exactamente como se escribió.
En caso de que haya una diferencia en cómo se puede lograr esto en diferentes shells, elegiré una respuesta que proporcione métodos para bash y zsh en lugar de respuestas que solo cubran una u otra.
Nota : en realidad no estoy convencido de que esto sea necesariamente una buena idea; Solo estoy preguntando si es posible. Si cree que esta es una idea estúpida, me alegraría escuchar el razonamiento detrás de su opinión, pero no publique tales comentarios en el campo de respuesta . Las respuestas reales me dicen cómo hacer esto o me explican por qué no es posible (o posiblemente ofrecen un método alternativo para obtener un resultado similar). Pero si quieres decirme por qué esto es tonto, publícalo como comentario. Votaré los comentarios bien razonados incluso si no estoy de acuerdo con la conclusión.
rm -I
es así-i
que solo se activa cuando-r
se pasan más de tres archivos o se pasa. Enbash
, use elCtrl-x *
atajo de teclado para expandir el globo e inspeccionarlo usted mismo.noglob
, p. Ej., Alias rm tonoglob my-rm
, y luego hacer que my-rm sea un script que compruebe si hay un globo, lo expande y pasa -i o no. No estoy seguro, no sé zsh.myrm
y dejar que ese script haga las cosas maravillosas que le gustan.Respuestas:
No es fácil. El problema es que cuando haces:
rm solo ve la lista de archivos, no el patrón global que ya ha sido expandido por el shell.
Lo que puedes hacer es (zsh):
Esto le dice a zsh que los patrones no deben expandirse al llamar a rm. Luego puede redefinir rm como una función que realiza la expansión en sí misma y agrega "-i" si es necesario, como:
Sin embargo, el problema con ese enfoque es que este nuevo "rm" no ve la diferencia entre
y
Para eliminar el archivo llamado
*
, deberías escribirlo:fuente
Funciona en bash, probablemente en otros proyectiles. Coloque en su
.bashrc
fuente
command rm
para evitar la codificación rígidaPATH
. Además, el enfoque de verificar el recuento de argumentos es poco confiable, ya querm
puede tomar opciones.\rm
$1
con comillas dobles, pero está equivocado acerca del escape del comando. Las citas solo suprimen los alias, NO la función de búsqueda. Esta respuesta sugiere una función, no un alias.