Co „rm -r ~” zrobiło z moim katalogiem domowym?

17

gedit tworzy ukryte pliki kopii zapasowych kończące się na „~”. Chciałem zrobić rekurencyjne czyszczenie mojego drzewa katalogów.

Polecenie rm *~usunie wszystkie lokalne pliki kończące się na „~”

Myślałem, rm -r *~ .że usunę wszystkie pliki z całego drzewa, ale napisałem na maszynie rm -r ~.

Pojawił się komunikat, że niektóre katalogi nie mogą zostać usunięte i wycofałem się z polecenia. Pytanie brzmi: co usunąłem?

Zauważyłem, że moja konfiguracja Filezilla zniknęła. Czy to polecenie usuwa wszystkie ukryte katalogi z katalogu domowego?

GUI Junkie
źródło
4
Cóż, przynajmniej mam strategię tworzenia kopii zapasowych ... Żadnych szkód.
GUI Junkie
2
Dobrze wiedzieć; Mam zasady, których nigdy nie używam, -rchyba że chcę się wszystkiego pozbyć.
ish
3
Na marginesie rm -r *~ .usunie wszystkie pliki i foldery (w bieżącym katalogu) pasujące *~lub .. ( .zostałby zignorowany rmjako szczególny wyjątek, ponieważ większość ludzi nie chce rekurencyjnie usuwać bieżącego katalogu. *~Usuwa wszystkie pliki i katalogi w bieżącym katalogu, które kończą się ~, ale nie pliki i katalogi w podkatalogach bieżącego katalogu. ) Więc nie tego byś chciał. Prawdopodobnie chciałbyś użyć findtej -execflagi do rekurencyjnego przeglądania drzewa katalogów i nierekurencyjnego usuwania każdego pliku z rozszerzeniem ~.
Eliah Kagan
@EliahKagan, tak myślę, ale znalezienie z -exec jest zawsze kłopotliwe. Przywrócenie katalogu domowego jest jednak trudniejsze :-)
GUI Junkie
1
Informacyjny: zaśpiewaj ~znak bez ucieczki (tak \~:) sprawi, że Bash, ZSH itp. (W rmzasadzie polecenie) będą myśleć, że masz na myśli katalog domowy.
Thomas Ward

Odpowiedzi:

31

Usunąłeś (prawie) cały katalog domowy!

rm -r something rekurencyjnie usuwa pliki i katalogi w / pod czymś ; zawiedzie tylko na elementach, których nie ma uprawnień do usunięcia, albo dlatego, że są własnością innego użytkownika (np. root), albo dlatego, że są w użyciu (np. montaż GVFS).

Jeśli nie dodasz -f(jak w, rm -rf something), otrzymasz coś takiego:

rm: remove write-protected regular file something’?
rm: descend into write-protected directory something’?

W tym momencie możesz przerwać, a następnie prawdopodobnie zdasz sobie sprawę, że wykonałeś niewłaściwe polecenie.

Sugestie społeczności dotyczące unikania takich wypadków

Uwaga: wiki społeczności, każdy może się przyłączyć.

  • W przypadku kilku plików użyj -iopcji, aby uzyskać potwierdzenie usunięcia plików lub katalogów:

    $ rm -ri something/
    rm: remove regular file something/file~’? y
    rm: descend into directory something’? y
    rm: remove regular file something/file’? y
    rm: remove directory something’? y
  • W przypadku usuwania z bieżącego katalogu poprzedź go znakiem, ./aby uniknąć pomyłkowego usunięcia innej lokalizacji:

    $ cd something
    $ rm -v ./*~
    removed ‘./file~’

    Powyższe miało na celu wykazanie użycia ./. Jeśli istnieje podkatalog, możesz oczywiście również użyć rm -v something/*~. Uwaga : nie sądzę, że rm ./.*usuwa wszystkie ukryte pliki w bieżącym katalogu. Zobacz to pytanie o awarię serwera o aby uzyskać obejścia dotyczące globowania ukrytych plików.

  • Przenieś zamiast usuń: Zamiast usuwać pliki rekurencyjnie, przywykłem do przenoszenia plików, których chcę się pozbyć gdzieś indziej, zanim je ostatecznie usunę. Jeśli coś poszło nie tak, łatwo je przywrócić.

    mv -b SOURCE DEST
  • Użyj find(ewentualnie z grep), aby wyświetlić podgląd, jeśli chcesz rekurencyjnie usuwać wybrane pliki. Powinieneś spróbować uczynić to rzadkim zjawiskiem, ale jeśli musisz ...

    1. findbez argumentów rekurencyjnie wyświetla listę wszystkich plików / katalogów w bieżącym. Powinieneś spróbować spojrzeć w góręman find dowiedzieć się, jak uczynić go selektywnym (skarbiec), ale jeśli nie chcesz się tym przejmować, możesz po prostu użyć znajomego grepdo filtrowania plików, które chcesz usunąć.
    2. Załóżmy, że jestem hakerem jądra uber-l33t i przeszkadza mi kilka KB „przykładowych” plików w moim drzewie źródłowym; Chcę usunąć wszystkie pliki zawierające to w nazwie. Więc piszę find | grep example, co daje mi te 20 plików. Wygląda to dobrze, więc teraz idę i usuwam te dokładne pliki, wraz z rm -vpełnymi poprzednio wymienionymi wyjściami, za pośrednictwem xargs:
      znajdź | przykład grep | xargs rm -v
      co daje mi ten wynik. Takie podglądanie zapobiega problemom, gdy powiedzmy, że popełnisz literówkę i piszesz samplezamiast example.

Powyższe rozwiązanie nie powinno być stosowane, jeśli możesz mieć nazwy plików zawierające spacje, znaki tabulacji, znaki nowej linii lub cudzysłowy ( "lub '), ponieważ doprowadzi to xargsdo niepowodzenia lub spowoduje podanie rmniekompletnych nazw plików, co w najgorszym przypadku może skończyć się usunięciem niewłaściwego akta. Bezpiecznym sposobem na wykonanie powyższych czynności jest zrobienie tego wszystkiego za pomocą findoperatorów i działań.

Poniżej zostaną wyświetlone wszystkie pliki zawierające to słowo example

find . -name "*example*"  

Jeśli ta lista to pliki, które chcesz usunąć, użyj -execakcji, aby przekazać pliki rm.

find . -name "*example*" -exec rm -v {} +

Zobacz Korzystanie z Znajdź, aby uzyskać dodatkową pomoc dotyczącą używania find.

Lekensteyn
źródło
1
findprzesyłanie strumieniowe do grepi xargs rmjest niebezpieczne.
geirha
2
@izx: dodano mv(moje ulubione polecenie);)
Takkat
1
Dodałbym przynajmniej przykład korzystania findz bezpiecznego sposobu, który nie psuje się (i potencjalnie usuwa niewłaściwe pliki), jeśli nazwy plików zawierają spację, tabulator, znak nowej linii "lub 'znaki. Np find . -name "*example*" -exec rm -v {} +. mywiki.wooledge.org/UsingFind
geirha
1
@geirha: dlaczego jest find -deletetaki niebezpieczny? Powiedziałbym coś tutaj, ale nie wiem inaczej niż ostatnio znalazłem i wyczyściłem mój, /mimo że na sucho bez opcji -deleteznalazłem tylko kilka plików, które chciałem usunąć. Widzę, że -exec rmzamiast tego polecasz .
Takkat
3
@Takkat -deletenie jest niebezpieczny i można go bezpiecznie używać zamiast -exec rm {} +. Generalnie wolę używać standardowych narzędzi i funkcji, jeśli to możliwe. -deletejest niestandardowym rozszerzeniem GNU do find, więc będzie działać dobrze na Ubuntu, ale może nie działać na innych systemach.
geirha
5

Tak. Niecytowana postać tyldy jako oddzielny argument zostanie rozszerzona na twój homedir. Więc rm -r ~został rozszerzony do rm -r /home/yourusename. Więc powiedziałeś rmowi, aby rekurencyjnie usuwał wszystkie pliki z twojego katalogu głównego.

Więcej informacji na temat działania rozszerzenia tyldy można znaleźć na stronie http://www.gnu.org/software/bash/manual/bashref.html#Tilde-Expansion .

geirha
źródło