Znajdź i usuń wszystkie katalogi o nazwie „test” w systemie Linux

35

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ąć.

zbieranie śmieci
źródło

Odpowiedzi:

70

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 -rdo usuwania katalogu i wszystkich jego potomków.

--Oznacza koniec argumentów, w celu uniknięcia drogi zaczynając -od leczonego jako argument.

-print0każe finddrukować \0znaki zamiast znaków nowej linii; i -0każe xargstraktować tylko \0jako separator argumentów.

Wywołuje to rmwiele katalogów jednocześnie, unikając narzutu wywoływania rmosobno dla każdego katalogu.


Alternatywnie findmoż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ć rmz wielu katalogów na raz :

find . -name test -type d -exec rm -r {} +

(Uwaga +na końcu; ten jest odpowiednikiem xargsrozwiązania.)

Arnaud Le Blanc
źródło
1
Doskonała odpowiedź, szczególnie +w znalezieniu. Nie miałem pojęcia, na pewno żałuję, że nie wiedziałem o tym dawno temu.
Scott,
uważaj na ostatnie polecenie, jakoś skasowało niektóre pliki. xargskomenda działa dobrze.
Henrique de Sousa,
23
find /path/to/dir -name "test" -type d -delete
  • -nazwa: szuka przekazanej nazwy. Możesz użyć -regexdo podania nazw opartych na wyrażeniach regularnych

  • -type: wyszukuje typy plików. dszuka tylko katalogów

  • -delete: akcja, która usuwa znalezioną listę.

Alternatywnie:

find /path/to/dir -name "test" -type d -exec rm -rf {} \;

Jak stwierdził JF Sebastian w komentarzach:

Możesz użyć +zamiast \;przekazać więcej niż jeden katalog na raz.

jaypal singh
źródło
1
Przepraszam, zapomniałem wspomnieć, że te katalogi mogą mieć pliki. Nie mogłem usunąć niektórych z nich z powodu błędu „znajdź: nie można usunąć„ ./start ”: katalog nie jest pusty”
odśmiecanie
@garbagecollection Dodałem aktualizację.
jaypal singh
3
możesz użyć +zamiast \;przekazać więcej niż jeden katalog na raz.
jfs
Dzięki @JFSebastian Dobra uwaga. Dodam to do odpowiedzi.
jaypal singh
5

Możesz także użyć opcji -exec

find . -name test -exec rm {} \;
sethi
źródło
3

Zakładając bash 4+

shopt -s globstar
rm -r ./**/test/

Końcowy ukośnik oznacza, że ​​będzie pasował tylko do katalogów. Test jest wcześniejszy z:

printf '%s\n' ./**/test/
zła
źródło
2

Załóżmy, że używasz gnu find , możesz użyć opcji -delete:

find . -name test -delete

co jest łatwiejsze do zapamiętania.

Chun Yang
źródło
2

Jak wskazuje kolejna odpowiedź, możesz spróbować znaleźć wszystkie katalogi o nazwie testi usunąć je

find -name "test" -type d -delete

Wystąpiły problemy z kompatybilnością krzyżową na komputerze Mac, więc użyłem tego równoważnego polecenia:

find -path "*/test" -type d -delete
  • -path : szuka wzorca we w pełni kwalifikowanej nazwie pliku.

W obu przypadkach, jeśli którykolwiek z wymienionych katalogów testzawiera pliki, findbędzie narzekał, że Directory is not emptyi nie usunie katalogu.

Jeśli masz zamiar usunąć wszystkie pliki, w tym testkatalog, możemy użyć tej samej sztuczki, aby usunąć wszystkie pliki w katalogach o testpierwszej nazwie .

find -path "*/test/*" -delete

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:

find -path "*/test" -type d -delete

Przykład:

$ tree
.
├── mytest
│   └── test
│       └── blah.txt
├── test
│   ├── bar.jpg
│   └── dir
│       └── bar.bak
└── testdir
    └── baz.c

5 directories, 4 files

$ find -path "*/test" -type d -delete
$ tree
.
├── mytest
│   └── test
├── test
└── testdir
    └── baz.c

4 directories, 1 file

$ find -name "test" -type d -delete
$ tree
.
├── mytest
└── testdir
    └── baz.c

2 directories, 1 file
Karl
źródło