Jak usunąć foldery o określonej nazwie

139

Jak w systemie Linux usunąć foldery o określonej nazwie, które są zagnieżdżone głęboko w hierarchii folderów?

Następujące ścieżki znajdują się w folderze i chciałbym usunąć wszystkie foldery o nazwie a.

1/2/3/a
1/2/3/b
10/20/30/a
10/20/30/b
100/200/300/a
100/200/300/b

Jakiego polecenia systemu Linux powinienem użyć z folderu nadrzędnego?

Joe
źródło
Być może nie ma sensu, ale może to komuś pomoże: mam 410 folderów w folderze głównym - każdy z 410 z dwoma podfolderami. Wszystkie pierwsze podfoldery mają nazwę „wersja ostateczna” i zawierają edytowane pliki PDF oraz listę zawartości programu Word. Wszystkie drugie podfoldery o nazwie tif_pdf_various_names zawierają pierwotnie zeskanowane pliki zapisane w formacie tiff (niektóre do 200 stron), ich nieedytowane pliki PDF i wersję roboczą listy zawartości .docx - czyli zbiór prac domowych. Musiałem stworzyć kolekcję 410 folderów zawierających tylko ostatecznie zredagowany materiał - z tiffami bliskimi 4 TB. Najłatwiejszą znalezioną metodą było użycie (w Micr
Jurie

Odpowiedzi:

155

Jeśli katalog docelowy jest pusty, użyj funkcji znajdź, filtruj tylko z katalogami, filtruj według nazwy, wykonaj rmdir:

find . -type d -name a -exec rmdir {} \;

Jeśli chcesz rekurencyjnie usunąć jego zawartość, zamień -exec rmdir {} \;na -deletelub -prune -exec rm -rf {} \;. Inne odpowiedzi zawierają szczegóły dotyczące tych wersji.

pistacja
źródło
9
Czy mógłbyś wyjaśnić, co to {} \;robi?
winklerrr
6
{}można odczytać jako „dla każdego pasującego pliku / folderu” - tj. zastępuje każdy „znaleziony” plik / folder. \;jest zakończeniem -execklauzuli.
wmorrison365
2
Daje mi to błąd „nie można usunąć”, gdy katalog nie jest pusty
blindeyes
1
Rozważ dodanie -pruneflagi do odpowiedzi zgodnie z sugestią @David Grayson. Bez tego findnadal będzie próbował odwiedzić brakujący folder i ostatecznie zakończy pracę z kodem błędu, który może np. Zawieść kompilację Dockera.
Czyżby
160

Użyj znajdź jako nazwę „a” i wykonaj rm, aby usunąć te nazwane zgodnie z własnymi życzeniami, w następujący sposób:

find . -name a -exec rm -rf {} \;

Przetestuj go najpierw, używając ls do wyświetlenia:

find . -name a -exec ls {} \;

Aby upewnić się, że usuwa to tylko katalogi, a nie zwykłe pliki, użyj argumentu „-type d” (zgodnie z sugestią w komentarzach):

find . -name a -type d -exec rm -rf {} \;

„{}” Jest podstawieniem dla każdego znalezionego pliku „a” - polecenie exec jest wykonywane na każdym znalezionym pliku.

wmorrison365
źródło
4
Prawdopodobnie chcesz tam dodać "-type d" po prostu na wypadek, gdyby plik miał taką samą nazwę.
Mark Loeser,
3
Zauważ też, że złapie coś podobnego 1/2/a/3/4, co może nie być zamierzone, więc +1 dla rekomendacji, aby najpierw przetestować ...
twalberg
9
spróbuj echo {}najpierw przetestować, zamiastls {}
Charney Kaye
2
Oto mój node_modules/.
saruftw
6
Używałem find . -name a -type d -exec rm -rf {} \;i działało, chociaż drukowano find: ‘./subdir/subdir/a’: No such file or directorydla każdego usuniętego katalogu.
pacoverflow
59

To również działa - usunie wszystkie foldery o nazwie „a” i ich zawartość:

rm -rf `find -type d -name a`
Arash Fotouhi
źródło
@Buffalo, jak to się stało? To defo działa, ale inne też. Byłbym zaskoczony, gdyby znalazł env, w którym to działa, ale inni zasadniczo nie udzielili wszystkich odpowiedzi find/rm.
wmorrison365
4
@ wmorrison365, ponieważ jeśli to zrobisz find . -name a -exec rm -rf {} \;, find ulegnie awarii, gdy spróbuje wejść do tego katalogu w celu wyszukania większej liczby elementów, powodując błąd, taki jak find: '1/2/3/a': No such file or directory.
Alex Grönholm
@Alex Grönholm oczywiście, ale wszystkie foldery o nazwie „a” są mimo wszystko usuwane. Jak stwierdzasz, find nie może później zajrzeć do usuniętego folderu „a”, ale to nie ma znaczenia. Chęć zachowania treści „a” do późniejszego przetwarzania przed usunięciem jest innym przypadkiem użycia niż ten, o który prosił OP.
wmorrison365
6
@ wmorrison365 Tak, katalogi są usuwane, ale nie sądzę, aby dobrze było polecać rozwiązanie, w którym polecenie zawodzi (zwraca niezerowy kod zakończenia).
Alex Grönholm,
1
To dawało mi błąd illegal option --t. Musiałam też przejść do katalogu do przeszukania ( stackoverflow.com/questions/25840713/... ) rm -rf `find . -type d -name a`.
Steve Harrison
25

Aby usunąć wszystkie katalogi o tej samej nazwie foo, uruchom:

find -type d -name foo -a -prune -exec rm -rf {} \;

W pozostałych odpowiedziach brakuje ważnej rzeczy: -pruneopcji. Bez tego -pruneGNU find usunie katalog o pasującej nazwie, a następnie spróbuje do niego powtórzyć, aby znaleźć więcej pasujących katalogów. -pruneOpcja informuje go nie rekursja do katalogu, który dopasowany warunki.

David Grayson
źródło
21

Skończyło się na tym, że chciałem usunąć moje node_modulesfoldery przed wykonaniem kopii zapasowej mojej pracy w toku za pomocą rsync. Kluczowym wymaganiem jest to, że node_modulesfolder może być zagnieżdżony, więc potrzebujesz tej -pruneopcji.

Najpierw uruchomiłem to, aby wizualnie zweryfikować foldery do usunięcia:

find -type d -name node_modules -prune

Następnie uruchomiłem to, aby usunąć je wszystkie:

find -type d -name node_modules -prune -exec rm -rf {} \;

Dzięki pistache

mpalumbo7
źródło
Ach, to działało ładnie, aby zrobić to z łatwością, możesz zapisać to jako mały skrypt sh #!/bin/bash echo "Found node_modules: "; find -type d -name node_modules -prune; read -r -p "Do you really want to delete all directories? [yes/no] " input; if [ ! $input != "yes" ]; then find -type d -name node_modules -prune -exec rm -rf {} \;; fi
powłoki
11
find ./ -name "FOLDERNAME" | xargs rm -Rf

Powinien załatwić sprawę. OSTRZEŻENIE, jeśli przypadkowo wpompujesz .lub /do xargs rm -Rfcałego komputera zostanie usunięty bez możliwości jego odzyskania, co wymaga ponownej instalacji systemu operacyjnego.

Slevin
źródło
2
Och, tylko to malutkie ryzyko. Czy to wszystko? Ha ha. Super dzięki za ostrzeżenie. Zdecydowanie popełniłbym ten błąd podczas pisania.
TinkerTenorSoftwareGuy
9

Miałem ponad 100 plików typu

log-12
log-123
log-34
....

powyższe odpowiedzi nie działają dla mnie

ale poniższe polecenie pomogło mi.

find . -name "log-*" -exec rm  -rf {} \;

dałem -typejak .tak to kasuje zarówno pliki i foldery, które rozpoczyna się zlog-

i rm -rfusuwa foldery rekurencyjnie, nawet jeśli zawiera pliki.

jeśli chcesz tylko foldery

find -type d -name "log-*" -exec rm  -rf {} \;

same pliki

find -type f -name "log-*" -exec rm  -rf {} \;
Thamaraiselvam
źródło
8

Łącząc wiele odpowiedzi, oto polecenie, które działa zarówno w systemie Linux, jak i MacOS

rm -rf $(find . -type d -name __pycache__)
marcosfede
źródło
Tylko jeden, który działał dla mnie, który również nie
powodował
7

Inny:

"-exec rm -rf {} \;" can be replaced by "-delete"

find -type d -name __pycache__ -delete      # GNU find
find . -type d -name __pycache__ -delete    # POSIX find (e.g. Mac OS X)
dgrigonis
źródło
3
Ta odpowiedź działa tylko w przypadku pustych folderów. -deletenie usuwa niepustych folderów.
maninak
Dziękujemy za dodanie wersji OSX
schu34
6

To polecenie działa dla mnie. Wykonuje swoją pracę rekurencyjnie

find . -name "node_modules" -type d -prune -exec rm -rf '{}' +

. - bieżący folder

„node_modules” - nazwa folderu

1nstinct
źródło
-2

znajdź ścieżkę / do / folderów -maxdepth 1 -name "my_ *" -type d -delete

PickleRick
źródło