Czy rm -rf *
usunie wszystkie pliki / foldery w bieżącym katalogu? Chcę się upewnić, że symbol wieloznaczny *
nie przesunie się w wyższych katalogach i nie usunie całego mojego systemu plików. :RE
Pamiętam robi chmod 777 .* -R
do chmod
ukrytych plików i chmod
ed cały mój system plików. Oczywiście byłem na koncie roota.
rm -rf ./*
i wyraźnie określiłem bieżący katalog ... ale Ankur wydaje się mówić, że to i tak nie ma znaczenia.Odpowiedzi:
Nie, jeśli nie poprawiłeś dużo swojej powłoki, nie usunie to plików ani katalogów zaczynających się od
.
. Aby je również usunąć, możesz albo podać je jawnielub użyj odpowiednich globalnych wzorców (dzięki Chris)
EDYCJA Chodzi o to, że nie można użyć
.*
do dopasowania plików takich jak.file
, ponieważ.*
lub.*?
będzie również pasować..
lub.
..[^.]*
dopasowuje pliki jak.file
, a..?*
dopasowuje pliki jak..foo
(*
dopasowuje zero lub więcej znaków, a?
dopasowuje dokładnie jeden).źródło
..?*
przechwytywanie wpisów zaczynających się na „..” (np..foo
.)rm
. więc usunięcie zawartości katalogu z * nie jest najmądrzejszym sposobem, imho.xargs
jest nieco poza zakresem tego pytania. Można np. Zacząć o tym myśleć, gdy powłoka skarży się na długość listy argumentów.Jeśli chcesz usunąć katalog i całą jego zawartość, możesz przejść do katalogu
chdir
nadrzędnego i dorm -rf
tego katalogu według nazwy, omijając całe pytanie globbing. Jeśli chcesz usunąć zawartość, ale zachować katalog, najłatwiej jest usunąć wszystko, a następnie ponownie utworzyć katalog.Opracowanie globu, który pasuje do wszystkich możliwych zapisów w katalogu, jest skomplikowane. i ..; łatwo jest znaleźć prostą odpowiedź (np.
* .??*
), która zadziała prawie zawsze w praktyce. Jest to OK do użytku interaktywnego, ponieważ jest łatwe do zapamiętania, a czasy, kiedy nie działa, można złapać za pomocą post-rmls -a
. W przypadku skryptu łatwiej jest usunąć wszystko i odtworzyć pusty katalog.źródło
Ponieważ myślę, że to pytanie dotyczy bardziej tego, co * robi (a nie rm), spróbujmy innego podejścia.
Jeśli nie masz pewności, co robi *, możesz najpierw „przetestować”, używając nieszkodliwego polecenia, takiego jak echo. Zanim to uruchomisz, spróbuj zgadnąć, co pokażą, jeśli uruchomisz je w swoim domu, reż.
Ale najpierw stwórzmy plac zabaw, abyśmy mogli bawić się z gwiazdami i zobaczyć, z czym skończymy.
Teraz w tym katalogu mamy to:
Teraz zwróć uwagę na to, co * rozwija się za pomocą polecenia echo:
Zobaczmy więc, co dzieje się z poleceniem rm
Jak widzisz, usunął tylko plik2, ponieważ * rozwinął się tylko do pliku2. Jeśli wpiszesz rm -rf. *, To będzie to samo co pisanie
I szczerze mówiąc, to nie wygląda zabawnie;)
Mam nadzieję, że to wyjaśnia * część twojego pytania.
Aktualizacja: Jednak, jak zauważa Ankur Goel, w rm jest wbudowana ochrona (coś niezwykłego dla poleceń powłoki :)
Stwórzmy nowy plac zabaw:
Teraz mamy to ponownie, ale z test1 będącym własnością roota jako ochrona, jeśli rm zacznie szaleć.
Więc usuńmy wszystko:
I wygląda na to, że rm nie usunął. i .. nawet gdybyśmy mu kazali !!!
Po tej długiej odpowiedzi okazuje się, że można bezpiecznie usunąć wszystko w reż z tym:
Ale użyłbym tego ostrożnie, ponieważ nie jestem pewien, czy wszystkie implementacje rm zachowują się w ten sposób!
źródło
Tak. rm -rf usunie tylko pliki i foldery w bieżącym katalogu i nie wejdzie na drzewo plików. rm nie będzie także podążał za dowiązaniami symbolicznymi i nie usuwał wskazywanych przez siebie plików, aby przypadkowo nie przyciąć innych części systemu plików.
źródło
Jeśli nie chcesz przechodzić o jeden poziom wyżej, jak mpez0 powiedział i
rm -rf
ten konkretny folder, istnieje sposób pracy na wszystkich katalogach / plikach z wyjątkiem.
iw..
bieżącym folderze poprzez:Oczywiście, jeśli którykolwiek z katalogów / plików zawiera jeden ze znaków w
IFS
specjalnej zmiennej powłoki (np. Spacja, tabulator, nowa linia), możesz najpierw zmienić IFS, uruchomić polecenie, a następnie przywrócić IFS.źródło
Znacznie łatwiejszym sposobem na opróżnienie całego folderu, unikając również problemów „zbyt wielu argumentów” omawianych w tej odpowiedzi , jest po prostu usunięcie i ponowne utworzenie samego katalogu. Aby upewnić się, że działa to poprawnie, gdy znajdujesz się w katalogu z dowiązaniem symbolicznym, użyj następujących wierszy:
(Jeśli użyjesz
yourdir
zamiast tego$(readlink -f yourdir)
, zamienisz link tylko wtedy, gdy pierwotna lokalizacja pozostanie pełna)źródło
xargs
...