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.


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


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


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.

3

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

Zachowaj ostrożność!


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


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.


@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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.