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 -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.)
xargskomenda działa dobrze.
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.
+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 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
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
+w znalezieniu. Nie miałem pojęcia, na pewno żałuję, że nie wiedziałem o tym dawno temu.