Mówienie „tak dla wszystkich” za pomocą rm -i

10

Powiedzmy, że chciałem się upewnić, że najpierw usuwam odpowiednie pliki, więc zrobiłem coś takiego:

rm -i *

tylko po to, aby upewnić się, że nie mam nic przeciwko usuwanym plikom. Poprosi mnie to o każdy plik. Po kilku plikach załóżmy, że zdaję sobie sprawę, że właśnie to chciałem usunąć. Czy zamiast CTRL+Cingerować i po prostu robić rm *, mogę po prostu powiedzieć wszystkim tak ?

To pytanie wynika bardziej z ciekawości niż z funkcjonalności.

Amit
źródło
Dziwne pytanie, ale i tak bądźmy kreatywni w naszych odpowiedziach!
dolmen

Odpowiedzi:

8

Nie.

(Chyba że znajdziesz sposób na przerzucenie „interaktywnego” bitu za pomocą debuggera).

użytkownik1686
źródło
[potrzebne źródło] :-)
Daniel Beck
6
@Daniel: coreutils/src/remove.c:335coreutils/lib/yesno.c:46(wygenerowano) → rpmatch(3): „zwraca 0 dla rozpoznanej odpowiedzi negatywnej („ nie ”), 1 dla rozpoznanej odpowiedzi pozytywnej („ tak ”) i -1, gdy wartość odpowiedzi nie jest rozpoznana”
1686
Bardzo fajne znalezisko!
Daniel Beck
3
Możesz także po prostu wkleić dużą liczbę y [podział linii] do terminala, co nie jest „Tak dla wszystkich”, ale dzieje się to samo.
Olli
haha prawda dla „y [linebreak]”, podoba mi się! :)
Amit
9

To naprawdę nie odpowiada na twoje pytanie. Ale zamiast używać rm -i, rozważ aliasing rmdo rm -I:

Strona podręcznika stanowi:

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

w swoim ~/.bashrc, wstaw:

 alias rm='rm -I'

to jest naprawdę przydatne!

Sebastian
źródło
4

Czy jest sposób, by powiedzieć wszystkim tak?

Odpowiedź brzmi tak, przy użyciu tego kodu:

$ yes "yes" | rm -vRI directory

  • v: pokaż listę plików, które zostały usunięte
  • R: rekursywnie usuwaj katalogi i ich zawartość
  • I: zgodnie z powyższym zaleceniem.
Teocci
źródło
3

Sprawdź najpierw za pomocą, ls *.blaa potem rm -f *.blamoże?

Zachowaj ostrożność!

Jonathan Ross
źródło
haha prawda, jest taka możliwość
Amit
3

Jeśli korzystasz z ekranu (ogólnie dobry pomysł), możesz:

ctrl-a : exec .! yes y

Spowodowałoby to, że screen uruchomiłby komendę „tak”, gdzie y było wyjściem, i skierowałby wspomniane wyjście do działającego programu (rm -i).

Slartibartfast
źródło
2

Można to zrobić, zastępując na bieżąco deskryptory plików aplikacji. Potrzebujesz jednak pliku pośredniego.

Możesz użyć gdb i nazwanego potoku w ten sposób (zakładając, że używasz więcej terminali, w przeciwnym razie musisz użyć screena lub czegoś innego):

  • utwórz nazwaną potok za pomocą „mkfifo myYesYesPipe”
  • uruchom interaktywną kopię za pomocą rm -i i znajdź jej PID
  • otwórz gdb

Następnie wpisz następujące polecenia w gdb, zastępując PID

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

To zastępuje klawiaturę nazwaną potokiem dla rm.

Teraz musisz wypełnić nazwaną rurę

  • uruchom tak> / path / to / myYesYesPipe

rm przeczyta potok i nadpisze wszystko.

David Costa
źródło
@grawity. zainspirowałeś mnie do korzystania z debuggera.
David Costa
1
  1. Umieść rmproces w tle za pomocą Ctrl+Z.
  2. Przywołaj ostatnie polecenie ( rm -i *polecenie)
  3. Usunąć -i
  4. Enter aby uruchomić polecenie
  5. fg %1
  6. Ctrl+C
dolmen
źródło
3
5s/fg/kill/; 6d
user1686,
3
W jaki sposób jest to lepsze niż to, co użytkownik wyraźnie powiedział, że nie chce robić?
Daniel Beck