Jak usunąć wszystkie pliki i podkatalogi z katalogu BEZ usunięcia katalogu w bash?

53

Czy istnieje polecenie usunięcia wszystkich plików i podkatalogów w katalogu BEZ usunięcia katalogu?

Na przykład, jeśli mam katalog „dontDeleteMe” z podkatalogami „1”, „2”, „3”, a każdy podkatalog zawiera kilka zdjęć, w jaki sposób mogę usunąć podkatalogi „1”, „2” i „3” i wszystkie zawarte w nich pliki, bez usuwania katalogu nadrzędnego „dontDeleteMe”?

użytkownik784637
źródło

Odpowiedzi:

66

Aby usunąć wszystko w katalogu bez usuwania katalogu, wpisz:

rm -rfv dontDeleteMe/*

Uwaga, ta /*część jest bardzo ważna. Jeśli umieścisz spację przed *, spowoduje to usunięcie wszystkich plików w bieżącym katalogu.

Ponadto, należy być bardzo ostrożnym z gry rm, -ra *wszystko w tym samym poleceniu. Mogą być katastrofalną kombinacją.

Aktualizacja: OK, zdałem sobie sprawę, że jeśli masz pliki ukryte / kropkowe [nazwy plików z kropkami na początku, np. .hidden], To pozostawi te pliki nietknięte.

Tak naprawdę najprostszym rozwiązaniem pierwotnego pytania jest: rm -rfv dontDeleteMe && mkdir dontDeleteMe

Jeszcze jeden byłoby użycie find„S -execopcji lub rurę xargs(poniżej):

find dontDeleteMe/* -print0 | xargs -0 rm -rv

Matt
źródło
Czy możesz podać przykład użycia xargs? Co to jest xargs?
justingrif
@ justingrif: find dontDeleteMe/* -print0 | xargs -0 rm -rv Wierzę, że w większości przypadków to zadziała, bez względu na spacje, a co nie. Ale przejdź do /tmp/katalogu, stwórz katalog testowy i wypróbuj go. :)
Matt
Aha, i ze strony podręcznika: „xargs - buduj i uruchamiaj wiersze poleceń ze standardowego wejścia”
Mat.
5
Ponowne utworzenie katalogu nie oznacza usunięcia jego zawartości. np. różnice w uprawnieniach do katalogu umask, różnice między właścicielami itp. ... Odpowiedź enzotib rozwiązałaby problemy z twoją oryginalną składnią
3
To nie jest dobra odpowiedź. Używanie * jest niebezpieczne i nie będzie działać na plikach dot bez „dotglob” (patrz poniżej). rm -rf dontDeleteMe && mkdir dontDeleteMenie gwarantuje, że katalog zostanie ponownie utworzony z tymi samymi uprawnieniami / właścicielami. Zamiast tego użyj jednego z find dontDeleteMe/ -mindepth 1 -deleteponiższych wariantów.
Nils Toedtmann
27

Jedynym powodem rm -r ./*, dla którego nie zawsze działają, jest to, że możesz mieć ukryte pliki i / lub foldery, które nie są dopasowane *.

W tym celu bashzapewnij opcję *dopasowania wszystkiego, nawet ukrytych obiektów:

cd dont-delete-me
shopt -s dotglob
rm -r ./*

Przydatne może być zresetowanie dotglobdo stanu domyślnego (nieustawionego), jeśli nadal używasz powłoki, w której wykonałeś powyższe polecenia:

shopt -u dotglob 
enzotib
źródło
Może również nie działać, gdy masz dużą liczbę plików
S ..
23

Otwórz terminal ( Ctrl+ Alt+ T) i wpisz:

find somedir -mindepth 1 -delete

To pasuje do wszystkich plików i katalogów wewnątrz somediroraz jego (dziadków) dzieci w tym „ukryte” pliki dot ale wyłączając somedirsię z powodu -mindepth 1, a następnie -deleteje.

Guciek
źródło
Witamy w AskUbuntu! Chociaż twoja odpowiedź może potencjalnie pomóc oryginalnemu plakatowi, brak informacji wyjaśniających, co by to zrobił, aby pomóc mu / jej, sprawia, że ​​twoja odpowiedź jest niekompletna.
Oyibo
3
Brakuje wyjaśnień, ale wciąż najlepsza odpowiedź. Działa również w OSX (oczywiście poza sposobem otwierania terminalu).
noamtm
6
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

Użyj xdevopcji, aby usunąć pliki tylko w granicach urządzenia.

Siergiej
źródło
GNU find ma -delete. Oznacza -depthto i jest łatwiejsze do zapamiętania niż-depth -exec rm -Rf {} \;
Nils Toedtmann
4

Aby usunąć (w terminalu) wszystkie pliki i podkatalogi oprócz katalogu podstawowego o nazwie „dontdelete”:

rm -rf dontdelete/*
kyleN
źródło
Nie usuwa to ukrytych plików, więc „wszystkie pliki” mogą być zbyt odważnym stwierdzeniem.
Stefan van den Akker
4

Możesz użyć findz -deleteflagą:

find dontDeleteMe/* -delete

Jest /*to ważne, ponieważ nakazuje findprzeszukiwanie tylko WEWNĄTRZ folderu o nazwie „dontDeleteMe”.

Upewnij się także, że -deleteflaga znajduje się na końcu findpolecenia.

SaultDon
źródło
1
To rozwiązanie nie usuwa żadnych ukrytych plików, chyba że włączysz dotglob. W przeciwnym razie użycie -mindepth 1opcji flagi wydaje się jedynym sposobem na jej uruchomienie.
Stefan van den Akker
3
rm -rf  directory/{.*,/*}

Co mówi:

Usuń wszystkie pliki zaczynające się od. w „katalogu” i wszystkich innych plikach.

Chociaż, jak uprzejmie zauważył Neftas, to rozwiązanie nie jest bezpieczne!

Bezpieczniejszym rozwiązaniem jest:

 rm -rf directory/!(.|..)
Tebe
źródło
Komenda ta mogłaby być potencjalnie niebezpieczne, ponieważ jesteś w tym również .i ..katalogów. Można tego uniknąć, zmieniając {.*}na {.??*}, ale wtedy nie usuniesz ukrytych plików zawierających tylko jeden znak, np .a.
Stefan van den Akker
co z tym jest? rm -rf katalog /! (. | ..)
Tebe
To wygląda na znacznie lepsze rozwiązanie niż to, co wymyśliłem. Czy mogę zasugerować edycję odpowiedzi?
Stefan van den Akker
sugestia przyjęta)
Tebe,
1

Nie jestem pewien, dlaczego jest to tak skomplikowane, pomóż mi, jeśli się mylę

cd DoNotDeleteDir #<- this is just to make sure we are inside
find . | xargs rm -rf

Otóż ​​to

użytkownik353305
źródło
Ma to również niewielką wadę próby usunięcia bieżącego katalogu, co oczywiście nie działa, ponieważ nadal jest używane jako katalog roboczy powłoki wywołującej.
David Foerster,
1

Istnieje jeszcze prostsza odpowiedź:

  1. cd dontDeleteMe

  2. rm -rf *

Podstawowy czas wykładu na temat administrowania systemem: Pamiętaj, aby zwracać uwagę na to, gdzie jesteś, gdy używasz takich komend zamiatania.

Nie mogę powiedzieć wystarczająco dużo. Musiałem odzyskać pudełko, ponieważ ktoś nie zwracał uwagi i wpisał się rm -rf *w /.

* nix zakłada, że ​​jeśli jesteś rootem lub sudo jako root, wiesz, co robisz. Upewnij się więc, że wiesz, co robisz, zanim to zrobisz.

Alternatywą, która upewnia się, że twoje polecenie „cd” działa przed wydaniem „rm”, jest użycie

cd dontDeleteMe && rm -rf *
użytkownik30619
źródło
6
To niebezpieczna sugestia. Co chcesz: cd dontDeleteMe && rm -rf *
Izkata,
@Izkata Lub upewnij się, że operacja cd zakończyła się powodzeniem, przed wydaniem komendy rm.
Eliah Kagan
1
@EliahKagan To właśnie robi mój fragment kodu ...
Izkata
W rzeczywistości nie jest to ani bardziej ani mniej niebezpieczne niż to, co sugerujesz. Wszystko, co robi &&, to połączenie dwóch poleceń razem, aby były wykonywane jednocześnie. Jeśli cokolwiek, moja metoda jest w rzeczywistości BEZPIECZNA, ponieważ musisz zatrzymać i .look przed wykonaniem polecenia rm -rf *. Wstrzymanie podwójnej kontroli jest zawsze lepsze.
user30619,
5
@ user30619 &&Operator nie tylko łączy polecenia razem; wymaga, aby każde polecenie zakończyło się powodzeniem przed wykonaniem następnego. Jeśli cdpolecenie z jakiegoś powodu nie powiedzie się (katalog nie istnieje, uprawnienia itp.), rmPolecenie nie zostanie wykonane. Nazwałbym to bezpieczniejszym.
ean5533
0
  1. Najłatwiejsza rzecz dla mnie - ekspert od okien, ale początkujący ubuntu
  2. Kliknij ikonę Pliki w programie uruchamiającym
  3. Przejdź do katalogu, w którym znajdują się pliki i foldery, które chcesz usunąć
  4. Kliknij prawym przyciskiem myszy pusty obszar okna obok plików i kliknij „Otwórz w terminalu” - pozostaw okno Pliki otwarte
  5. Otworzy się okno terminala i zostanie „ustawione” na folder, który znajdziesz
  6. Możesz wpisać „dir” (zignoruj ​​cytaty, gdy mówię „wpisz”) i naciśnij klawisz Enter, aby wyświetlić terminal z listą plików i folderów - tylko po to, aby udowodnić, że jesteś „w” odpowiednim folderze
  7. wpisz „rm -rf *” i naciśnij enter
  8. w zależności od rozmiaru folderów / plików do usunięcia system wstrzyma się
  9. Gdy terminal powróci, okno Pliki, które otworzyłeś, powie teraz „Folder jest pusty”
  10. Odniosłem sukces dzięki tej metodzie, dzięki czemu mogłem zobaczyć pliki / folder zarówno w oknie Pliki, jak iw wyniku polecenia Dir w oknie terminala
  11. Pocieszało mnie również to, że okno Pliki wyświetlało folder teraz pusty - zwłaszcza, że ​​goniłem te pliki w poszukiwaniu folderu śmieci, w którym się znajdowały
  12. Dziękujemy wszystkim, którzy przesłali odpowiedzi - było to bardzo pouczające
William Saxon
źródło
To wydaje się dość skomplikowane - zwłaszcza, że ​​i tak skończysz biegać rm -rf *.
David Foerster,
0
rm -rf ${PWD}/*

wyczyści obecny katalog roboczy

Nick Mitchell
źródło