Decir 'sí a todos' usando rm -i


10

Digamos que quería asegurarme de que primero estoy eliminando los archivos correctos, así que hice algo como:

rm -i *

solo para asegurarme de que estoy de acuerdo con los archivos que estoy eliminando. Entonces esto me preguntará por cada archivo. Después de algunos archivos, supongamos que me doy cuenta de que es exactamente lo que quería eliminar. En lugar de CTRL+Chacer y simplemente hacer rm *, ¿hay alguna forma en que pueda decir Sí a todos ?

Esta pregunta proviene más de la curiosidad que de la funcionalidad.


Pregunta extraña, pero de todos modos, ¡seamos creativos en nuestras respuestas!
dolmen

Respuestas:


8

No.

(A menos que encuentre una manera de voltear el bit 'interactivo' con un depurador).


[cita requerida] :-)
Daniel Beck

66
@Daniel: coreutils/src/remove.c:335coreutils/lib/yesno.c:46(generado) → rpmatch(3): "devuelve 0 para una respuesta negativa reconocida (" no "), 1 para una respuesta positiva reconocida (" sí ") y -1 cuando el valor de la respuesta no se reconoce"
usuario1686

Muy buen hallazgo!
Daniel Beck

3
Además, puede pegar una gran cantidad de y [salto de línea] en la terminal, que no es "Sí a todos", pero sucede lo mismo.
Olli

jaja cierto para la cosa 'y [salto de línea]', me gusta! :)
Amit

9

Bueno, esto realmente no responde a tu pregunta. Pero en lugar de usar rm -i, considere usar alias rmpara rm -I:

La página del manual dice:

-I     prompt once before removing more than three files, or when removing 
       recursively. Less intrusive than -i, while still giving protection 
       against most mistakes

en tu ~/.bashrc, pon:

 alias rm='rm -I'

¡Esto es realmente útil!


4

¿Hay alguna manera de decir Sí a todos?

La respuesta es sí, usando este código:

$ yes "yes" | rm -vRI directory

  • v: muestra la lista de archivos que se han eliminado
  • R: eliminar directorios y sus contenidos de forma recursiva
  • I: según la recomendación anterior.

3

Solo verifique primero usando ls *.blay luego rm -f *.blatal vez?

¡Con precaución!


jaja cierto, esta es una posibilidad
Amit

3

Si está ejecutando en pantalla (una buena idea en general), puede hacer:

ctrl-a : exec .! yes y

Esto haría que la pantalla ejecutara el comando 'yes' con y siendo la salida, y dirija dicha salida al programa en ejecución (rm -i).


2

Esto se puede hacer reemplazando los descriptores de los archivos de la aplicación sobre la marcha. Sin embargo, necesitará un archivo intermedio.

Puede usar gdb y una tubería con nombre como esta (suponiendo que esté usando más terminales, de lo contrario, debe usar la pantalla o algo más):

  • crear una tubería con nombre con "mkfifo myYesYesPipe"
  • inicie la copia interactiva con rm -i y encuentre su PID
  • abrir gdb

Luego escriba los siguientes comandos en gdb, reemplazando el PID

attach rmPID
call open("/path/to/myYesYesPipe",66,0666)
call dup2(3,0)
call close(3)
detach
quit

Esto reemplaza el teclado con una tubería con nombre para rm.

Ahora tienes que llenar la tubería nombrada

  • ejecutar yes> / ruta / a / myYesYesPipe

rm leerá la tubería y sobrescribirá todo.


@grawity. me inspiraste para usar el depurador.
David Costa

1
  1. Ponga el rmproceso en segundo plano con Ctrl+Z.
  2. Recupere el último comando (el rm -i *comando)
  3. Eliminar el -i
  4. Enter ejecutar el comando
  5. fg %1
  6. Ctrl+C

3
5s/fg/kill/; 6d
user1686

3
¿Cómo es esto mejor de lo que el usuario mencionó explícitamente que no quiere hacer?
Daniel Beck
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.