Zamiar:
rm -rf string*
Problem:
rm -rf string *
Pierwszy przypadek to legalne i powszechne użycie rm, mała literówka może powodować wiele problemów w drugim przypadku. Czy istnieje prosty sposób, aby skutecznie zabezpieczyć się przed przypadkowym pociągnięciem lub wiodącym znakiem wieloznacznym?
zsh
lubbash
) wolałbym raczej przyzwyczaić się naciskać klawisz tab (aby uruchomić automatyczne uzupełnianie) przed naciśnięciem klawisza powrotutouch -- -i
utworzy plik,-i
który zostanie przekazanyrm
jako parametr,-i
gdy w argumentach dodasz symbol wieloznaczny.rm *
. Jeśli wpiszeszrm name *
, rozwinie się dorm name -i other names
.-i
nie będzie przetwarzany jako opcja, ponieważ nie jest wcześniejszy niż nazwy plików.Odpowiedzi:
DEBUG
Pułapka może być napisane, aby anulować poleceń, które wyglądają podejrzanie. Następujące lub podobny do niego kod można dodać do~/.bashrc
:Dostosuj logikę do smaku.
(Tak naprawdę nie spodziewam się, że to podejście będzie przydatne - zbyt wiele sposobów, by zniszczyć komendę destrukcyjnie, aby znaleźć je testujące jeden po drugim - ale zapewnia dosłowną odpowiedź na pytanie).
źródło
Nie ma sposobu na całkowicie kuloodporny system. I dodając „Jesteś pewien?” podpowiedzi do rzeczy przynoszą efekt przeciwny do zamierzonego i prowadzą do „Oczywiście, że jestem pewien”. reakcje kneejerk.
Sztuczka, którą wybrałem z książki w poprzednich latach, polega na tym
ls -R blah*
, by zrobić torm -fr blah*
wtedy i tylko wtedy, gdy pojawiła się lista, która pojawiła się, co chciałem.Wystarczy
ls
najpierw wykonać polecenie, a następnie ↑usunąćls -R
i zastąpićrm -fr
.Ostatnie pytanie brzmi: „Jeśli informacje były dla Ciebie cenne, gdzie jest twoja kopia zapasowa?”
źródło
^ls -R^rm -rf^
i być może ustawić jako aliasls -R
to, co właściwie robię cały czas, ale jest to tak instynktowne w tym momencie, że wymknęło mi się z umysłu, kiedy formowałem się przez odpowiedź. Więc +1 za to.cat > .log
Potem wracam i wklejam lub szarpię nazwę pliku przed.log
. Więc w żadnym momencie nie mam> valuablefile
na cmdline.rm -i
, więc często po prostu komponuję moje polecenie rm, a następnie umieszczam\
na początku linii. (\rm
unika się rozwijania aliasu dla rm, ponieważ cytowano część słowa). Jeśli potrzebowałem-r
lub-f
, tak, czasami zaczynamls
odrm
lub po prostu rezygnuję z tej-rf
części. (edytuj, jak uzyskać formatowanie odwrotnego ukośnika? bquote bslash bslash bquote nie udaje sięCzy możesz nauczyć się używać, powiedzmy,
rmrf
zamiastrm -rf
?Jeśli tak, ta funkcja bash da ci szansę zobaczyć, co się właściwie stanie przed potwierdzeniem polecenia:
Aby ta funkcja była stała, dodaj tę linię do
~/.bashrc
pliku na każdym używanym komputerze.Porównanie z popularnym
rm
aliasemCzęsto określa się alias:
Ma to dwa ograniczenia:
Jeśli zaczniesz polegać na tym aliasie, będziesz w szoku, gdy jesteś na maszynie lub w środowisku, które go nie ma. Natomiast próba uruchomienia
rmrf
na komputerze bez tej funkcji zwróci nieszkodliwośćcommand not found
.Ten alias nie jest pomocny w twoim przypadku, ponieważ
-f
opcja podana w wierszu poleceń zastępuje-i
opcję aliasu.źródło
rm -rf
polecenia, co się stanie? Tworzenie takich pseudo funkcji ostatecznie komplikuje proste rozwiązanie: Bądź bardziej ostrożny i zrozum, jakie są uprawnienia.rmrf
, a nie tylko tworzeniem funkcji powłoki,rm
która sprawdza argumenty-r
lub-rf
wprowadza w tym przypadku specjalną logikę, w przeciwnym razie bezpośrednio wywołująccommand rm "$@"
prawdziwerm
polecenie?-f
jeśli nie masz-i
. Opuszczenie-f
daje dodatkowe ostrzeżenie, na przykład przed usunięciem pliku tylko do odczytu.Jeśli jestem w sytuacji, w której usunięcie niewłaściwych plików jest naprawdę wielka sprawa, jedna z rzeczy robiłem jest dokonać kosza folder podobny
mkdir trashcan
, a następnie Mam skryptrmTrashcan
, który marm -rf trashcan/*
lubrm -rf *
lub podobna, napisany bardzo starannie i sprawdzone kilka razy.W ten sposób, jeśli popełniam błąd, błąd dotyczy
mv
polecenia, a nierm
polecenia. Kiedy zrobięls
i jestem pewien , co dokładnie usuwam,rmTrashcan
brudna praca jest bezpieczna.Było to również niezwykle wygodne w sytuacji, gdy musiałem usuwać kopie zapasowe. Mógłbym
mv
cały miesiąc tworzenia kopii zapasowych w koszu,mv
tych kilku, które chciałem zachować (1. miesiąca, 15. miesiąca) z powrotem w kopiach zapasowych, a potemrmTranshcan
resztę. Wykonywanie podobnego polecenia jest trudne dorm
samodzielnego wykonania, a wykonanie tego w ten sposób pozwala mils
mieć pewność, że mam pewność, jakie pliki zostawiam (zamiast wyliczania plików, które zamierzam usunąć)źródło
Zamiast kłopotać się dwoma poleceniami (
ls
irm
), myślę, że prostszym i łatwiejszym sposobem jest użyciefind
:Jeśli przypadkowo wpiszesz
"string *"
, usunie pliki o nazwachstring chars
istring letters
( i tak właśnie chciałeś), ale nie pobierze każdego pliku jak*
w powłoce.Możesz także pominąć,
-delete
aby zobaczyć, które pliki mają zostać usunięte, a następnie nacisnąć strzałkę w górę i pisać-delete
łatwiej niż pisanie^ls -R^rm -rf
lub inne bzdury.źródło
find
wykona zagnieżdżone wyszukiwanie plików, które pasują zamiast tylko jawnych parametrów zadeklarowanych w wierszu poleceń. Myślę, że to mija się z celem. Mogę się jednak mylić.Nie całkiem. W innej odpowiedzi zaproponowano utworzenie niestandardowego polecenia w celu dodania monitu przed wykonaniem zadania. Problem z tym niestandardowym poleceniem polega na tym, że musi być świadomie zainstalowany w systemach, nad którymi pracujesz. I nawet jeśli jest zainstalowany, problemem jest twój refleks, aby trafić,
y
aby wykonać zadanie, może wejść w grę.Oznacza to, że jest to wszystko problem z interfejsem użytkownika, nawet jeśli jest na poziomie tekstu / wiersza poleceń. Jak wiele oczekujesz sieci ochronnych, które ochronią cię przed zrobieniem czegoś, czego nie powinieneś? To jest jak nożyce: jeśli jesteś w jakiś sposób niedbały i poślizgniesz się i podciąłeś rękę, gdy zamierzasz przeciąć tkaninę lub papier, kto jest winny? A nawet sygnalizacja świetlna i znaki stop: Naprawdę nic nie stoi na przeszkodzie, aby kierowca uruchomił światło lub zignorował znaki drogowe, poza wyraźną świadomością tego, co może się zdarzyć, jeśli zaangażują się w tak ryzykowne zachowanie.
To powiedziawszy, że najlepsze, realistyczne rozwiązanie polega na uprawnieniach systemowych dla użytkowników i grup. To najlepsza / jedyna prawdziwa siatka bezpieczeństwa do ochrony użytkownika przed sobą.
Jeśli pracujesz w systemie, w którym jako jedyny masz do niego dostęp, możesz mieć ochotę na
chmod 777
wszystko, ale nie w ten sposób konfiguruje się system racjonalny. Zamiast tego uprawnienia powinny być podobne755
do wszystkich katalogów i644
wszystkich plików niewykonywalnych. Pliki wykonywalne powinny być755
co najmniej, ale może nawet744
jeśli chcesz, aby inni czytali, ale nie uruchamiali plików.źródło
Spróbuj skomponować początkowe
rm
polecenie bez-f
flagi, ale-i
zamiast tego, takie, którerm
będą monitować o każdy plik, który zamierza usunąć. W przypadku małych rekurencyjnych operacji usuwania możesz przytrzymać yklawisz, gdy masz pewność, że polecenie zostało wpisane poprawnie. W przypadku dużych usunięć możesz przerwać operację i użyć historii wiersza poleceń, aby ostrożnie zmienić na-i
a-f
.źródło
y[RETURN]
każdy plik, nic nie możesz powstrzymać dzięki GNU rm. Edycja tego-i
jest właściwą drogą, gdy już poprawnie wypiszesz polecenie. Następnie pojawia się monit tylko w pliku tylko do odczytu i może inne rzeczy.rm -I
aby wyświetlał monit tylko raz i tylko w przypadku potencjalnie niebezpiecznych usunięć (tj. Wielu plików).rm ma
-i
i-I
flagi do potwierdzenia przed każdym usunięciem. W przeszłości niektóre dystrybucje domyślnie je włączały. To okropny pomysł. Daj użytkownikowi zbyt wiele okien dialogowych z potwierdzeniami do normalnych operacji, a oni zaczną je normalnie potwierdzać. To po prostu przenosi wymóg „ostrożności” (zawsze czerwonej flagi) na nowy i bardziej irytujący dialog. „Tak. Tak. Tak. Tak! Tak! Cholera, głupi komputer, po prostu usuń pliki TAK TAK TAK TAK TAK - ODPAD ZNACZENIE NIE! NIEEEEEE!” To jest problem z dialogiem „Tak, ale miałem na myśli brak”. Ta odpowiedź zawiera wizualne wyjaśnienie, dlaczego okna dialogowe potwierdzenia pojawiają się w niewłaściwym czasie.Rodzaj błędu, który opisujesz, to poślizgnięcie się „wykonania akcji, która nie była zamierzona”. Użytkownik zazwyczaj natychmiast rozpoznaje błąd i dokładnie wie, jak go naprawić. Niestety, Unix nie daje użytkownikowi możliwości, rm natychmiast usuwa plik. Każdy inny system operacyjny rozwiązuje ten problem, umożliwiając cofnięcie usuwania, przynajmniej przez krótką chwilę, przy użyciu Kosza.
Istnieją różne systemy śmieci dla Uniksa i ta odpowiedź jest pełna sugestii .
Pytanie dotyczy aliasu rm lub nie aliasu rm. Plusy do aliasingu rm ...
Wady aliasingu rm ...
Jeśli podążysz za pierwszym argumentem za daleko, zakończysz używanie vi (nie vim, vi), csh (nie tcsh, csh) i innych przestarzałych narzędzi, ponieważ są one powszechnie dostępne. Mimo to istnieje ryzyko nadmiernego dostosowania środowiska. Wolę zabrać ze sobą narzędzia i uczynić to tak łatwym, jak to możliwe. YMMV.
Dwa i trzy to problemy techniczne. Można je rozwiązać za pomocą sprytnej pracy żniwiarza, która sprawdza wielkość kosza i okresowo czyści rzeczy, podobnie jak tmpreaper . Może to być zadanie cron lub bardziej sprytna wersja może korzystać z różnych infrastruktur zdarzeń systemu plików dostępnych w wielu dystrybucjach stacjonarnych Linuksa. To nie jest proste, a jeszcze trudniejsze do zrobienia wydajnie. Lepiej jest znaleźć istniejący system niż próbować stworzyć własny.
Czwarty może być rozwiązany przez uczynienie z nowego rm aliasu powłoki
alias rm='trash'
, wtedy nie wpłynie to na programy.Piąty to problem, który pozostawiam czytelnikowi do rozwiązania. rm nie ma wielu przełączników.
źródło
rm -i
, ale często używam,\rm
aby uzyskać niezrównane zachowanie. Piszę wrm -i
dowolnym momencie PLANOWANIA, aby powiedzieć „nie” jednemu z argumentów. Czasami uruchamiam komendęls
jako komendę, a następnie wstawiam \ rm dopiero po zakończeniu. Więc nie ma szans, żebym przypadkowo wrócił do powroturm -rf /
zamiast/.../file
rm -I
lubrm --interactive=once
jest o wiele, znacznie mniej irytujący niżrm -i
i wciąż łapie coś niebezpiecznego (monituje tylko, gdy są więcej niż 3 pliki lub jeśli jest rekurencyjny, i tylko RAZ zamiast KAŻDEGO PLIKU.)-i
może dać użytkownikowi czas na zmianę celów. Ta odpowiedź na powiązane pytanie określa to wszystko.rm -i
dłużej niż 30 sekund bez jego wyłączenia. Mając na uwadze,rm -I
że wyświetla monity tylko wtedy, gdy jest prawdopodobne, że spieprzyłeś; monit pojawia się tylko w przypadku dużych usunięć. Gdy próbujesz usunąć kilka rzeczy i pojawia się monit, jesteś zaskoczony i zdajesz sobie sprawę, że przypadkowo wpisałeś „foo *”.-rf
które właśnie odkryłem) są słabymi serwerami proxy do wykrywania prawdopodobnego zepsucia. Chęć usunięcia podkatalogu prawdopodobnie nie jest zepsuta. Wiadomość nie pomaga, ponieważ tylko potwierdza to, co zrobił użytkownik, bez dodawania użytecznych informacji w momencie, gdy użytkownik nie chce tego zweryfikować. „rm: usunąć 1 argument rekurencyjnie?” „Tak, usuń katalog, właśnie kazałem ci to zrobić! ... czekaj, który to katalog? CRAP !!!”Uczę wszystkich o
!$
= ostatnim argumencie w ostatniej sztuczce polecenia:Umożliwia to sprawdzenie rozszerzenia symbolu wieloznacznego, a następnie użycie dokładnie tego samego wzorca globu bez możliwości wstawienia spacji przed znakiem
*
.Sugeruję również, aby ludzie nigdy nie wycinali i nie wklejali globblującego wzoru wieloznacznego w potencjalnie destrukcyjnej linii poleceń. Bo w moich rękach to był problem :)
Technik w moim laboratorium właśnie popełnił ten błąd w zeszłym tygodniu (3 miesiące pracy) - i tak, mieliśmy kopię zapasową (1 dzień opóźnienia).
źródło
Wydaje się, że wszyscy mówią: „Bądź bardziej ostrożny”, „Nie rób aliasu / potwierdzenia, ponieważ przyzwyczaisz się nie zwracać na to należytej uwagi”.
Fajnie i wszystko. To znaczy, nie sądzę, że powinieneś tworzyć alias
rm
(anirmrf
, ponieważ możesz łatwo to zepsuć i wpisać prawdziwe polecenie).Ale dlaczego nie możesz utworzyć aliasu / skryptu i nazwać go, powiedzmy,
remove
i podać tylko jeden argument (np. 1 $)? Symbol wieloznaczny powinien wynosić 2 USD, z powodu przypadkowej spacji (amiright?), A zatem twój skrypt / opakowanie / alias nie będzie zasilany drugim. Tak, możesz wykonać tylko jeden zestaw skasowań (z symbolem wieloznacznym) na raz, ale to cena, którą zapłacisz.Gdybym pisał coś fajnego, mógłbym poprosić o podanie liczby plików i katalogów, które planuje usunąć, oraz całkowitego rozmiaru rzeczy, które usuwałem, a następnie poprosić o potwierdzenie, ale może to utrudnić przepływ. Może spraw, aby ta opcja była włączona
remove
? (-ja). Możesz również sprawdzić 1 $, aby sprawdzić, czy jest to tylko jeden symbol wieloznaczny i poprosić o potwierdzenie, a także podać katalog, w którym aktualnie się znajdujesz.Poza tym istnieje wiele
rm
zamienników. Wiele osób stara się zachować zgodność z koszem pulpitu interfejsu użytkownika. Warto zajrzeć do niektórych z nich.źródło
remove \*
? Jeśli twój skrypt pozwala globalnej powłoce rozszerzyć swoje dane wejściowe, nie widzę, aby pomogła.Bardzo prostą sztuczką jest postawienie
-rf
na końcu:rm whatever* -rf
To drastycznie zmniejsza wskaźnik błędów, ponieważ wpisujesz więcej znaków po
*
, więc masz więcej czasu na literówki.To nie rozwiązuje wszystkiego. Prosta codzienna sztuczka.
źródło