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.

Amit
fuente
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).

usuario1686
fuente
[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!

Sebastian
fuente
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.
Teocci
fuente
3

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

¡Con precaución!

Jonathan Ross
fuente
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).

Slartibartfast
fuente
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.

David Costa
fuente
@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
dolmen
fuente
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