Saying 'yes to all' using rm -i

10

3

Say I wanted to make sure I'm removing the right files first, so I did something like:

rm -i *

just to make sure that I'm okay with the files that I am removing. So this will ask me for each file. After a few files, suppose I realize it's exactly what I wanted to remove. Instead of CTRL+Cing and just doing rm *, is there a way I can just say Yes to all?

This question comes more so from curiosity rather than functionality.

Amit

Posted 2011-03-26T19:51:40.530

Reputation: 371

Strange question, but anyway, let's be creative in our answers! – dolmen – 2011-03-26T20:45:35.140

Answers

8

No.

(Unless you find a way to flip the 'interactive' bit with a debugger.)

user1686

Posted 2011-03-26T19:51:40.530

Reputation: 283 655

[citation needed] :-) – Daniel Beck – 2011-03-26T20:26:02.950

6

@Daniel: coreutils/src/remove.c:335coreutils/lib/yesno.c:46 (generated) → rpmatch(3): "returns 0 for a recognized negative response ("no"), 1 for a recognized positive response ("yes"), and -1 when the value of response is unrecognized"

– user1686 – 2011-03-26T20:40:03.593

Very nice find! – Daniel Beck – 2011-03-26T20:45:16.203

3Also, you can just paste large number of y[line break] to terminal, which is not "Yes to all", but same thing happens. – Olli – 2011-03-26T21:22:10.840

haha true for the 'y[linebreak]' thing, i like it! :) – Amit – 2011-03-31T03:53:56.377

8

Well, this doesn't really answer your question. But instead of using rm -i, consider aliasing rm to rm -I:

The man page states:

-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 your ~/.bashrc, put:

 alias rm='rm -I'

this is actually useful!

Sebastian

Posted 2011-03-26T19:51:40.530

Reputation: 610

4

Is there a way I can just say Yes to all?

The answer is yes, using this code:

$ yes "yes" | rm -vRI directory

  • v: show the list of files that have been removed
  • R: remove directories and their contents recursively
  • I: as per the recommendation above.

Teocci

Posted 2011-03-26T19:51:40.530

Reputation: 171

3

Just check first using ls *.bla and then rm -f *.bla maybe?

Use caution!

Jonathan Ross

Posted 2011-03-26T19:51:40.530

Reputation: 139

haha true this is a possibility – Amit – 2011-03-31T03:51:52.900

3

If you are running in screen (a good idea in general), you can do:

ctrl-a : exec .! yes y

This would cause screen to run the 'yes' command with y being the output, and direct said output to the running program (rm -i).

Slartibartfast

Posted 2011-03-26T19:51:40.530

Reputation: 6 899

2

This can be done by replacing the application file descriptors on the fly. You'll need an intermediate file though.

You can use gdb and a named pipe like this (assuming you are using more terminals, else you have to use screen or something else):

  • create a named pipe with "mkfifo myYesYesPipe"
  • start the interactive copy with rm -i and find its PID
  • open gdb

Then type the following commands in gdb, replacing the PID

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

This replaces the keyboard with a named pipe for rm.

Now you have to fill the named pipe

  • run yes > /path/to/myYesYesPipe

rm will read the pipe and overwrite everything.

David Costa

Posted 2011-03-26T19:51:40.530

Reputation: 701

@grawity. you inspired me to use the debugger. – David Costa – 2011-03-27T17:21:23.833

1

  1. Put the rm process in the background with Ctrl+Z.
  2. Recall the last command (the rm -i * command)
  3. Remove the -i
  4. Enter to run the command
  5. fg %1
  6. Ctrl+C

dolmen

Posted 2011-03-26T19:51:40.530

Reputation: 1 075

35s/fg/kill/; 6d – user1686 – 2011-03-26T20:55:45.903

3How is this better than what the user explicitly mentioned he doesn't want to do? – Daniel Beck – 2011-03-26T20:56:50.350