W systemie Unix, jak usunąć wszystko w bieżącym katalogu i poniżej?

108

Wiem, że to usunie wszystko w podkatalogu i poniżej:

rm -rf <subdir-name>

Ale jak usunąć wszystko w bieżącym katalogu, a także każdy podkatalog pod nim oraz zawartość wszystkich tych podkatalogów?

Jen
źródło
2
To musi być
oszustwo

Odpowiedzi:

166

Ćwicz bezpieczną obsługę komputera. Po prostu przejdź o jeden poziom wyżej w hierarchii i nie używaj wyrażeń wieloznacznych:

cd ..; rm -rf -- <dir-to-remove>

Dwie kreski --powiedzieć rm, że <dir-to-remove>nie jest to opcja wiersza polecenia, nawet jeśli zaczyna się od myślnika.

tvanfosson
źródło
8
Dlaczego to jest bezpieczniejsze?
Jen
34
Ponieważ dokładnie dopasowujesz nazwany katalog, a zatem istnieje mniejsze prawdopodobieństwo, że usuniesz coś, czego nie zamierzasz usunąć.
tvanfosson
5
Prawdziwe. Widziałem siebie, jak robię to dość łatwo.
Jen
26
czy nie usuwa również samego katalogu? Następnie musisz wykonać mkdir <dir-to-remove>. Ale wtedy każde dowiązanie stałe odnoszące się do tego katalogu będzie później odrębnym katalogiem.
Johannes Schaub - litb
5
@Yen, jeśli użyjesz, rm ./możesz przypadkowo wpisać, rm . /co może być katastrofą.
irfandar
44

Usunie wszystkie pliki / katalogi poniżej bieżącego.

find -mindepth 1 -delete

Jeśli chcesz zrobić to samo z innym katalogiem, którego nazwę masz, możesz go po prostu nazwać

find <name-of-directory> -mindepth 1 -delete

Jeśli chcesz usunąć nie tylko jego podkatalogi i pliki, ale także sam katalog, pomiń -mindepth 1. Zrób to bez, -deleteaby uzyskać listę rzeczy, które zostaną usunięte.

Johannes Schaub - litb
źródło
Musiałem usunąć wszystkie pliki w podkatalogach, ale nie chciałem usuwać samych podkatalogów. find <name-of-direcotry> -mindepth 2 -delete działało świetnie!
Tim Dearborn
Potrzebujesz, -mindepth 1jeśli określasz katalog ( find <name-of-directory> -mindepth 1 -delete). W przeciwnym razie Johannes ma rację, nie usunie bieżącego katalogu roboczego (jeśli jest używany find -delete).
Weboide,
IMO, to najlepsza odpowiedź, szczególnie w skryptach.
wizonesolutions
1
Próbowałem: find -mindepth 1 -deleteale mam illegal option -- male działał świetnie, kiedy usunięto opcję mindepth find . -delete
Sharon
41

To, co zawsze robię, to pisanie

rm -rf *

a następnie naciśnij ESC- * , a bash rozwinie * do jawnej listy plików i katalogów w bieżącym katalogu roboczym.

Korzyści to:

  • Mogę przejrzeć listę plików do usunięcia przed naciśnięciem ENTER.
  • Historia poleceń nie będzie zawierała „rm -rf *” z nienaruszonym symbolem wieloznacznym, który może zostać przypadkowo użyty ponownie w niewłaściwym miejscu w niewłaściwym czasie. Zamiast tego historia poleceń będzie zawierała rzeczywiste nazwy plików.
  • Przydała się również odpowiedź „poczekaj chwilę… które pliki właśnie usunąłem?”. Nazwy plików są widoczne w buforze przewijania terminala lub w historii poleceń.

W rzeczywistości podoba mi się to tak bardzo, że uczyniłem to domyślne zachowanie dla TAB z tym wierszem w .bashrc:

bind TAB:insert-completions
Ville Laurikari
źródło
Brakuje --w tej odpowiedzi? Muszę powiedzieć, że to podejście jest niesamowite.
Ben Voigt
Lepszym sposobem jest uruchomienie tego z sudo
Abbas Torabi
22

Posługiwać się

rm -rf *

Aktualizacja: .oznacza bieżący katalog, ale nie możemy tego użyć. Wydaje się, że polecenie ma jawne sprawdzenia dla .i ... Zamiast tego użyj symboli wieloznacznych. Ale to może być ryzykowne.

Bezpieczniejszą wersją IMO jest użycie:

rm -ri * 

(to monituje o potwierdzenie przed usunięciem każdego pliku / katalogu).

dirkgently
źródło
13
„Może być ryzykowne” jest zdumiewająco lakoniczne.
5
Robiąc takie rzeczy, znalazłem szybkie ls -r. najpierw pozwala zobaczyć, co zamierzasz usunąć. Przydatne, aby dać szybkie wyobrażenie, że nie zamierzasz usunąć całego dysku ...
Rich Bradshaw
2
Dlaczego jest bardziej ryzykowne niż rm -rf <subdir-name>?
Jen
2
@Yen - ponieważ jeśli zrobisz to w złym miejscu, możesz uzyskać katastrofalne skutki. Użycie określonej nazwy w niewłaściwym miejscu może się nie udać tylko wtedy, gdy znajduje się tam ten sam podkatalog.
tvanfosson
1
Nie możesz usunąć rodzica, przebywając w dziecku.
dirkgently
6

To prawda, że ​​bezpośrednio rm –rf .usunie wszystko w bieżącym, w tym wszelkie podkatalogi i ich zawartość. Pojedyncza kropka ( .) oznacza katalog bieżący. uważaj, aby tego nie robić, rm -rf ..ponieważ podwójna kropka ( ..) oznacza poprzedni katalog.

Biorąc to pod uwagę, jeśli jesteś podobny do mnie i masz jednocześnie otwartych wiele okien terminala, lepiej bądź bezpieczny i użyj rm -ir .Spójrzmy na argumenty poleceń, aby zrozumieć, dlaczego.

Po pierwsze, jeśli spojrzysz na stronę podręcznika rmpoleceń ( man rmpod większością systemów Unix), zauważysz, że –roznacza to „rekurencyjne usuwanie zawartości katalogów”. Zatem zrobienie tego w rm -r .pojedynkę spowodowałoby usunięcie wszystkiego w bieżącym katalogu i wszystkiego poniżej.

W rm –rf .dodanym -f oznacza „ignoruj ​​nieistniejące pliki, nigdy nie pytaj”. To polecenie usuwa wszystkie pliki i katalogi w bieżącym katalogu i nigdy nie wyświetla monitu o potwierdzenie, że naprawdę chcesz to zrobić. -fjest szczególnie niebezpieczne, jeśli uruchomisz polecenie jako użytkownik z uprawnieniami, ponieważ możesz usunąć zawartość dowolnego katalogu bez możliwości upewnienia się, że naprawdę tego chcesz.

Na otherhand w że zastępuje środki „prompt przed każdym usunięciu”. Oznacza to, że będziesz miał szansę powiedzieć „oups! Nie o to mi chodzi”, zanim rm z radością usunie wszystkie twoje pliki.rm -ri .-i-f

We wczesnych latach sysadmin zrobiłem rm -rf /w systemie będąc zalogowanym z pełnymi uprawnieniami (root). W rezultacie minęły dwa dni na przywrócenie systemu z kopii zapasowych. Dlatego teraz zatrudniam rm -ri.

Pierre-Luc Simard
źródło
6

Co powiesz na:

rm -rf "$(pwd -P)"/* 

źródło
27
jQuery jest tak potężny.
Paweł
5
rm  -rf * 

Nie rób tego! To jest niebezpieczne! UPEWNIJ SIĘ, ŻE JESTEŚ W ODPOWIEDNIM KATALOGU!

nkassis
źródło
4

upewnij się, że jesteś we właściwym katalogu

rm -rf *
digitaljoel
źródło
2
Nie powoduje to usunięcia plików ani podkatalogów, których nazwa zaczyna się od kropki.
1
prawdziwe. w moich testach również rm -rf. tvanfosson ma najlepsze rozwiązanie IMO ze swoim "cd ..; rm -rf <dir-to-remove>"
digitaljoel
2

To najprostsze bezpieczne i ogólne rozwiązanie to prawdopodobnie:

find -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf
devnev
źródło
1

Uważam, że ta odpowiedź jest lepsza:

/unix/12593/how-to-remove-all-the-files-in-a-directory

Jeśli wywoływany jest katalog najwyższego poziomu images, uruchom rm -r images/*. Używa to operatora globalnego powłoki *do uruchamiania rm -rna każdym pliku lub katalogu w obrazach.

w zasadzie przechodzisz o jeden poziom w górę, a następnie mówisz usuń wszystko w katalogu X. W ten sposób nadal określasz, który folder powinien mieć usuniętą zawartość, co jest bezpieczniejsze niż zwykłe powiedzenie „usuń wszystko tutaj”, przy jednoczesnym zachowaniu oryginalnego folderu (co czasami chcesz, ponieważ nie możesz lub po prostu nie chcesz aby zmodyfikować istniejące uprawnienia folderu)

Francisco Noriega
źródło