Mit rm -i 'Ja zu allen' sagen

10

Angenommen, ich wollte sicherstellen, dass ich zuerst die richtigen Dateien entferne, also habe ich Folgendes getan:

rm -i *

Nur um sicherzustellen, dass ich mit den Dateien, die ich entferne, einverstanden bin. Das wird mich also nach jeder Datei fragen. Angenommen, nach ein paar Dateien wird mir klar, dass es genau das ist, was ich entfernen wollte. CTRL+CGibt rm *es eine Möglichkeit, einfach zu allen Ja zu sagen, anstatt zu tun ?

Diese Frage kommt eher aus Neugier als aus Funktionalität.

Amit
quelle
Seltsame Frage, aber lasst uns trotzdem kreativ in unseren Antworten sein!
Dolmen

Antworten:

8

Nein.

(Es sei denn, Sie finden eine Möglichkeit, das 'interaktive' Bit mit einem Debugger umzudrehen.)

user1686
quelle
[Zitat benötigt] :-)
Daniel Beck
6
@Daniel: coreutils/src/remove.c:335coreutils/lib/yesno.c:46(generiert) → rpmatch(3): "gibt 0 für eine erkannte negative Antwort (" nein "), 1 für eine erkannte positive Antwort (" ja ") und -1 zurück, wenn der Wert der Antwort nicht erkannt wird"
user1686
Sehr schöner Fund!
Daniel Beck
3
Sie können auch einfach eine große Anzahl von y [Zeilenumbruch] in das Terminal einfügen, was nicht "Ja für alle" ist, aber dasselbe passiert.
Olli
haha wahr für das 'y [linebreak]' Ding, ich mag es! :)
Amit
9

Nun, das beantwortet Ihre Frage nicht wirklich. Aber statt der Verwendung rm -ibetrachtet Aliasing rmzu rm -I:

In der Manpage heißt es:

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

in dein ~/.bashrc, setze:

 alias rm='rm -I'

das ist eigentlich nützlich!

Sebastian
quelle
4

Gibt es eine Möglichkeit, wie ich einfach zu allen Ja sagen kann?

Die Antwort lautet Ja, wenn Sie diesen Code verwenden:

$ yes "yes" | rm -vRI directory

  • v: Zeigt die Liste der entfernten Dateien an
  • R: Verzeichnisse und deren Inhalt rekursiv entfernen
  • I: gemäß obiger Empfehlung.
Teocci
quelle
3

Einfach zuerst mit ls *.blaund dann rm -f *.blavielleicht überprüfen ?

Sei vorsichtig!

Jonathan Ross
quelle
haha wahr das ist eine möglichkeit
Amit
3

Wenn Sie auf dem Bildschirm arbeiten (eine gute Idee im Allgemeinen), können Sie Folgendes tun:

ctrl-a : exec .! yes y

Dies würde dazu führen, dass screen den Befehl 'yes' ausführt, wobei y die Ausgabe ist, und diese Ausgabe an das laufende Programm (rm -i) weiterleitet.

Slartibartfast
quelle
2

Dies kann durch Ersetzen der Anwendungsdateideskriptoren im laufenden Betrieb erfolgen. Sie benötigen jedoch eine Zwischendatei.

Sie können gdb und eine Named Pipe wie diese verwenden (vorausgesetzt, Sie verwenden mehr Terminals, andernfalls müssen Sie screen oder etwas anderes verwenden):

  • Erstellen Sie eine Named Pipe mit "mkfifo myYesYesPipe".
  • Starten Sie die interaktive Kopie mit rm -i und suchen Sie die PID
  • gdb öffnen

Geben Sie dann die folgenden Befehle in gdb ein und ersetzen Sie die PID

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

Dies ersetzt die Tastatur durch eine Named Pipe für rm.

Jetzt müssen Sie die benannte Pipe füllen

  • Führen Sie yes> / path / to / myYesYesPipe aus

rm liest die Pipe und überschreibt alles.

David Costa
quelle
@grawity. Sie haben mich dazu inspiriert, den Debugger zu verwenden.
David Costa
1
  1. Stellen Sie den rmProzess mit in den Hintergrund Ctrl+Z.
  2. Erinnern Sie sich an den letzten Befehl (den rm -i *Befehl)
  3. Entferne das -i
  4. Enter um den Befehl auszuführen
  5. fg %1
  6. Ctrl+C
Dolmen
quelle
3
5s/fg/kill/; 6d
user1686
3
Wie ist das besser als das, was der Benutzer ausdrücklich erwähnt hat und was er nicht tun möchte?
Daniel Beck