Mam wiele katalogów o nazwie „test” i chciałbym je usunąć.
Wiem, jak je znaleźć i wydrukować, używając:
find . -name test -print
Jak usunąć katalogi?
Pamiętaj, że mam również pliki w katalogu i należy je również usunąć.
xargs
robi całą magię:
find . -name test -type d -print0|xargs -0 rm -r --
xargs
wykonuje polecenie przekazane jako parametry, z argumentami przekazywanymi do stdin.
Służy rm -r
do usuwania katalogu i wszystkich jego potomków.
--
Oznacza koniec argumentów, w celu uniknięcia drogi zaczynając -
od leczonego jako argument.
-print0
każe find
drukować \0
znaki zamiast znaków nowej linii; i -0
każe xargs
traktować tylko \0
jako separator argumentów.
Wywołuje to rm
wiele katalogów jednocześnie, unikając narzutu wywoływania rm
osobno dla każdego katalogu.
Alternatywnie find
można również uruchomić polecenie dla każdego wybranego pliku:
find . -name test -type d -exec rm -r {} \;
I to jeden z lepszych wyników, ponieważ będzie zadzwonić rm
z wielu katalogów na raz :
find . -name test -type d -exec rm -r {} +
(Uwaga +
na końcu; ten jest odpowiednikiem xargs
rozwiązania.)
+
w znalezieniu. Nie miałem pojęcia, na pewno żałuję, że nie wiedziałem o tym dawno temu.xargs
komenda działa dobrze.-nazwa: szuka przekazanej nazwy. Możesz użyć
-regex
do podania nazw opartych na wyrażeniach regularnych-type: wyszukuje typy plików.
d
szuka tylko katalogów-delete: akcja, która usuwa znalezioną listę.
Alternatywnie:
Jak stwierdził JF Sebastian w komentarzach:
Możesz użyć
+
zamiast\;
przekazać więcej niż jeden katalog na raz.źródło
+
zamiast\;
przekazać więcej niż jeden katalog na raz.jeszcze innym sposobem na to jest
Pomocny link do znalezienia: http://www.softpanorama.info/Tools/Find/using_exec_option_and_xargs_in_find.shtml
źródło
Możesz także użyć opcji -exec
źródło
Zakładając bash 4+
Końcowy ukośnik oznacza, że będzie pasował tylko do katalogów. Test jest wcześniejszy z:
źródło
Załóżmy, że używasz gnu find , możesz użyć opcji -delete:
find . -name test -delete
co jest łatwiejsze do zapamiętania.
źródło
Jak wskazuje kolejna odpowiedź, możesz spróbować znaleźć wszystkie katalogi o nazwie
test
i usunąć jeWystąpiły problemy z kompatybilnością krzyżową na komputerze Mac, więc użyłem tego równoważnego polecenia:
W obu przypadkach, jeśli którykolwiek z wymienionych katalogów
test
zawiera pliki,find
będzie narzekał, żeDirectory is not empty
i nie usunie katalogu.Jeśli masz zamiar usunąć wszystkie pliki, w tym
test
katalog, możemy użyć tej samej sztuczki, aby usunąć wszystkie pliki w katalogach otest
pierwszej nazwie .Wzorzec:
"*/test/*"
zapewni, że usuwamy tylko pliki z katalogu o nazwie/test/
. Gdy katalogi będą puste, możemy je usunąć i usunąć za pomocą pierwszego polecenia:Przykład:
źródło