Dire "si a tutti" usando rm -i


10

Di 'che volevo assicurarmi di rimuovere prima i file giusti, quindi ho fatto qualcosa del tipo:

rm -i *

solo per essere sicuro che sto bene con i file che sto rimuovendo. Quindi questo mi chiederà ogni file. Dopo alcuni file, supponiamo di rendermi conto che è esattamente quello che volevo rimuovere. Invece di CTRL+Cfare e semplicemente fare rm *, c'è un modo per dire semplicemente Sì a tutti ?

Questa domanda viene più dalla curiosità che dalla funzionalità.


Domanda strana, ma comunque, siamo creativi nelle nostre risposte!
dolmen,

Risposte:


8

No.

(A meno che non trovi un modo per invertire il bit "interattivo" con un debugger.)


[citazione necessaria] :-)
Daniel Beck

6
@Daniel: coreutils/src/remove.c:335coreutils/lib/yesno.c:46(generato) → rpmatch(3): "restituisce 0 per una risposta negativa riconosciuta (" no "), 1 per una risposta positiva riconosciuta (" sì ") e -1 quando il valore della risposta non è riconosciuto"
user1686

Molto bella scoperta!
Daniel Beck

3
Inoltre, puoi semplicemente incollare un gran numero di y [interruzione di linea] sul terminale, che non è "Sì a tutti", ma succede la stessa cosa.
Olli,

haha vero per la cosa 'y [linebreak]', mi piace! :)
Entro il

9

Bene, questo non risponde davvero alla tua domanda. Invece di utilizzare rm -i, considera l'aliasing rmper rm -I:

La pagina man afferma:

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

nel tuo ~/.bashrc, inserisci:

 alias rm='rm -I'

questo è effettivamente utile!


4

C'è un modo in cui posso dire di sì a tutti?

La risposta è sì, usando questo codice:

$ yes "yes" | rm -vRI directory

  • v: mostra l'elenco dei file che sono stati rimossi
  • R: rimuove ricorsivamente le directory e i loro contenuti
  • I: come da raccomandazione sopra.

3

Basta controllare prima usando ls *.blae poi rm -f *.blaforse?

Fai attenzione!


haha vero questa è una possibilità
Amit

3

Se stai eseguendo sullo schermo (una buona idea in generale), puoi fare:

ctrl-a : exec .! yes y

Ciò farebbe sì che lo schermo eseguisse il comando 'yes' con y come output e indirizzasse detto output al programma in esecuzione (rm -i).


2

Questo può essere fatto sostituendo al volo i descrittori dei file dell'applicazione. Avrai bisogno di un file intermedio però.

Puoi usare gdb e una named pipe come questa (supponendo che tu stia usando più terminali, altrimenti devi usare lo schermo o qualcos'altro):

  • creare una pipa denominata con "mkfifo myYesYesPipe"
  • avvia la copia interattiva con rm -i e trova il suo PID
  • apri gdb

Quindi digitare i seguenti comandi in gdb, sostituendo il PID

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

Questo sostituisce la tastiera con una pipe denominata per rm.

Ora devi riempire la pipa denominata

  • eseguire yes> / path / to / myYesYesPipe

rm leggerà la pipe e sovrascriverà tutto.


@grawity. mi hai ispirato a usare il debugger.
David Costa,

1
  1. Metti il rmprocesso in background con Ctrl+Z.
  2. Richiama l'ultimo comando (il rm -i *comando)
  3. Rimuovi il -i
  4. Enter per eseguire il comando
  5. fg %1
  6. Ctrl+C

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

3
In che modo è meglio di ciò che l'utente ha esplicitamente dichiarato di non voler fare?
Daniel Beck
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.