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”?
źródło
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. :)rm -rf dontDeleteMe && mkdir dontDeleteMe
nie gwarantuje, że katalog zostanie ponownie utworzony z tymi samymi uprawnieniami / właścicielami. Zamiast tego użyj jednego zfind dontDeleteMe/ -mindepth 1 -delete
poniższych wariantów.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
bash
zapewnij opcję*
dopasowania wszystkiego, nawet ukrytych obiektów:Przydatne może być zresetowanie
dotglob
do stanu domyślnego (nieustawionego), jeśli nadal używasz powłoki, w której wykonałeś powyższe polecenia:źródło
Otwórz terminal ( Ctrl+ Alt+ T) i wpisz:
To pasuje do wszystkich plików i katalogów wewnątrz
somedir
oraz jego (dziadków) dzieci w tym „ukryte” pliki dot ale wyłączającsomedir
się z powodu-mindepth 1
, a następnie-delete
je.źródło
Użyj
xdev
opcji, aby usunąć pliki tylko w granicach urządzenia.źródło
-delete
. Oznacza-depth
to i jest łatwiejsze do zapamiętania niż-depth -exec rm -Rf {} \;
Aby usunąć (w terminalu) wszystkie pliki i podkatalogi oprócz katalogu podstawowego o nazwie „dontdelete”:
źródło
Możesz użyć
find
z-delete
flagą:find dontDeleteMe/* -delete
Jest
/*
to ważne, ponieważ nakazujefind
przeszukiwanie tylko WEWNĄTRZ folderu o nazwie „dontDeleteMe”.Upewnij się także, że
-delete
flaga znajduje się na końcufind
polecenia.źródło
dotglob
. W przeciwnym razie użycie-mindepth 1
opcji flagi wydaje się jedynym sposobem na jej uruchomienie.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:
źródło
.
i..
katalogów. Można tego uniknąć, zmieniając{.*}
na{.??*}
, ale wtedy nie usuniesz ukrytych plików zawierających tylko jeden znak, np.a
.Nie jestem pewien, dlaczego jest to tak skomplikowane, pomóż mi, jeśli się mylę
Otóż to
źródło
Istnieje jeszcze prostsza odpowiedź:
cd dontDeleteMe
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
źródło
cd dontDeleteMe && rm -rf *
&&
Operator nie tylko łączy polecenia razem; wymaga, aby każde polecenie zakończyło się powodzeniem przed wykonaniem następnego. Jeślicd
polecenie z jakiegoś powodu nie powiedzie się (katalog nie istnieje, uprawnienia itp.),rm
Polecenie nie zostanie wykonane. Nazwałbym to bezpieczniejszym.źródło
rm -rf *
.wyczyści obecny katalog roboczy
źródło