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?


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.


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.


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`

@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.


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


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.


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 {} \;

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__)

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)

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


-2

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.