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ąć.
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ąć.
Odpowiedzi:
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.)
xargs
komenda działa dobrze.
find /path/to/dir -name "test" -type d -delete
-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:
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.
+
zamiast \;
przekazać więcej niż jeden katalog na raz.
jeszcze innym sposobem na to jest
find . -name test -exec rm -R "{}" \;
Pomocny link do znalezienia: http://www.softpanorama.info/Tools/Find/using_exec_option_and_xargs_in_find.shtml
Jak wskazuje kolejna odpowiedź, możesz spróbować znaleźć wszystkie katalogi o nazwie test
i 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
W obu przypadkach, jeśli którykolwiek z wymienionych katalogów test
zawiera pliki, find
będzie narzekał, że Directory 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 o test
pierwszej 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
+
w znalezieniu. Nie miałem pojęcia, na pewno żałuję, że nie wiedziałem o tym dawno temu.