rm -rf /some/path/*
usuwa wszystkie nie ukryte pliki z tego katalogu (i podkatalogów).
rm -rf /some/path/.*
usuwa wszystkie ukryte pliki z tego katalogu (ale nie katalogów), a także wyświetla następujący błąd / ostrzeżenie:
rm: cannot remove directory: `/some/dir/.'
rm: cannot remove directory: `/some/dir/..'
Jaki jest właściwy sposób usuwania wszystkich ukrytych i nie ukrytych plików i folderów rekurencyjnie w katalogu docelowym bez otrzymywania ostrzeżenia / błędu dotyczącego .
i ..
?
rm ..?* .[!.]*
powinno to zrobić).*
dopasowuje wszystkie pliki bez kropek,.[!.]*
dopasowuje wszystkie pliki kropek oprócz.
i pliki, których nazwa zaczyna się od..
, i..?*
pasuje do wszystkich plików kropek oprócz..
. Razem pasują do wszystkich plików innych niż.
i..
. Jeśli którykolwiek z tych trzech wzorów nic nie pasuje, rozwija się do siebie;rm -f
nie przejmuje się nieistniejącymi argumentami, więc to nie ma znaczenia.Możesz także użyć
find
. Jest to bardziej złożone, ale ma tę zaletę, że działa nawet wtedy, gdy jest tak wiele plików, że powyższe symbole wieloznaczne wykraczają poza limit długości wiersza poleceń systemu.Usunięcie i ponowne utworzenie katalogu może być łatwiejsze. Ma to tę zaletę (lub wadę, że zależnie od przypadku), że powoduje powstanie pustego katalogu, nawet jeśli inny program jednocześnie tworzy pliki w oryginalnym katalogu.
źródło
find
Alternatywa powraca „sukces”, nawet jeśli jakiś plik nie został pomyślnie usunięty; nie dobre dla skryptu.find
polecenia strona man dla find stwierdza: „Ponieważ -delete oznacza -depth, nie można z powodzeniem używać -prune i -delete razem”. - jeszcze korzystasz-prune -delete
?-prune
nic tu nie robi. A po przeczytaniu widzę, że nie odpowiedziałem poprawnie na pytanie: starałem się nie powtarzać, ale pytanie wyraźnie prosi o rekurencyjne usunięcie. Poprawiłem swoją odpowiedź..[^.]*
zamiast.[!.]*
gdy włączone jest podstawianie historii (co jest domyślnie przypadkiem interaktywnie, ale nie w skryptach), ponieważ zsh analizuje!
jako odwołanie do historii. Ale w zsh nie potrzebujesz tego w pierwszej kolejności, możesz po prostu użyć*(D)
plików kropek (bez.
lub..
) w dopasowaniu do znaku wieloznacznego.Właśnie zdałem sobie sprawę, że jest to najwygodniejszy sposób w większości dystrybucji Linuksa:
gdzie
-A
= wypisz wszystko oprócz.
i..
-1
= umieść każdy element w jednym wierszuźródło
ls -A1 /your/path/ | xargs rm -rf
należy zastosowaćZmień
dotglob
opcję powłoki i użyj*
lub użyj czegoś podobnegofind
.źródło
rm -rf /some/dir
a następnie utworzyć nowy pusty katalog na jego miejscu.Powinno to działać tak samo jak odpowiedź @Gilles, ale bardziej kompaktowe:
lub
powinien również dodać
if
do użycia w skryptach, aby być bezpiecznym:źródło
alias cleandir='rm -rf {,.[!.],..?}*'
tak jest.Znajdź to twój przyjaciel.
Jeśli chcesz użyć rekurencyjnie przeszukaj coś innego w bieżącym katalogu ($ PWD), dodaj ścieżkę bezpośrednio po
find
poleceniu; npfind /path ! -name '.' ! -name '..' -delete
. Jeśli chcesz tylko obniżyćn
liczbę katalogów, użyj-maxdepth n
opcji tuż po/path
parametrze.Powyższe polecenie zostało przetestowane w systemie Ubuntu 13.04. Prawdopodobnie będzie działał na innych, nowoczesnych systemach Linux.
źródło
find . ! -name '.' ! -name '..' -type d -delete
Zakładając, że dany katalog jest
./dir
, tousunie wszystkie pliki, w
./dir
tym ukryte pliki i katalogi, rekurencyjnie, łącznie z./dir
samym katalogiem.Jeśli nie chcesz usuwać samego katalogu, możesz po prostu ponownie go utworzyć lub użyć
lub jeśli
find
nie wspierasz-delete
,Korzystanie
-mindepth 1
pozwala zachować katalog najwyższego poziomu./dir
.źródło
Proponuję eksperymentować z
Turn ON kropek (ukryte)
zestaw
dotglob
shopt -s dotglob
Turn OFF kropki
nieoprawny
dotglob
shopt -u dotglob
Ta metoda działała dokładnie tak, jak chciałem dla polecenia kopiowania, w którym brakowało ukrytych katalogów.
Więc zrobiłem usunąć (usuń), a ups ...
... to też działa!
Przyszło mi do głowy, że drogi czytelniku nie widzę
message_splitter
katalogu. W dowolny sposób ma.svn
folder, który należy usunąć i skopiować do.Ze
man
strony ...Bibliografia:
źródło
Wypróbuj ten kod:
źródło