Jak usunąć wszystkie puste katalogi w katalogu z wiersza poleceń?

58

Powiedz, że mam katalog o nazwie foo/. Ten folder zawiera podkatalogi. Jak mogę usunąć wszystkie puste katalogi za pomocą jednego polecenia?

justingrif
źródło

Odpowiedzi:

119

Wypróbuj to polecenie:

find . -empty -type d -delete

findPolecenie służy do wyszukiwania plików / katalogów odpowiadających konkretnym kryteriów z określonej ścieżce, w tym przypadku katalog bieżący (stąd .).

Ta -emptyopcja obowiązuje dla każdego pustego pliku i katalogu.

-type dOpcja odnosi się do pliku typu określonego; w tym przypadku doznacza katalog typu pliku .

-deleteOpcja jest działanie do wykonania, i odnosi się do wszystkich plików znajdujących się w wyszukiwaniu.

Rachunek
źródło
Myślę, że to najłatwiejszy sposób na zrobienie tego, więc zamierzam zaznaczyć to jako odpowiedź.
justingrif 30.10.11
Hej, Bill, próbowałem zadać kolejne podobne pytanie i nie pozwoliło mi to, ponieważ było to oszustwo, więc miałem nadzieję, że możesz mi tutaj odpowiedzieć. Powiedzmy, że chciałem zrobić to samo co powyżej, ale usuń wszystkie katalogi, czy są puste, czy nie.
justingrif
3
Sposób, w jaki chcesz usunąć katalogi, niezależnie od tego, czy są one puste, wpisz następujące polecenie: rm -rf <directory-name>. Spowoduje to usunięcie katalogu wraz z całą jego zawartością, w tym plikami i podkatalogami. Ta -ropcja oznacza rekurencyjne usuwanie, a -fpolecenie oznacza, że ​​nie pytaj przed usunięciem. Jeśli chcesz otrzymać monit przed usunięciem katalogu / pliku, zamień -fopcję na -iopcję.
Bill
Co jeśli w wymienionym katalogu były jakieś pliki, które chciałem zachować. Chciałem więc usunąć wszystkie katalogi w / foo / bar /, ale zachowaj wszystkie pliki, które mogą tam być.
justingrif
2
Można to zrobić za pomocą potoku, aby wprowadzić stdoutjedną komendę (np. find) Do stdindrugiej (np. rm), Jednak należy zachować ostrożność, ponieważ może to wymazać lub usunąć pliki / katalogi, których nie chcesz usunąć! Aby uzyskać dodatkowe informacje, jak to zrobić, zobacz manstrony dla każdego z tych poleceń. Aby być bezpiecznym, zawsze testuj takie rzeczy w katalogu tymczasowym przed wypróbowaniem prawdziwych rzeczy.
Bill
11

Możesz skorzystać z rmdirodmowy polecenia usunięcia niepustych katalogów oraz find -depthopcji przejścia od dołu do góry drzewa katalogów:

find . -depth -exec rmdir {} \;  

(i zignoruj ​​błędy) lub dołącz, 2>/dev/nullaby naprawdę je zignorować.

-depthMożliwość findstartów znalezienie u dołu drzewa katalogów.

rm -rfusunie wszystkie pliki w katalogu (i jego podkatalogach i ....) ORAZ wszystkie katalogi i wszystko.

waltinator
źródło
8
rmdir *

Usunie wszystkie puste katalogi. Zgłasza błąd dla każdego niepustego katalogu i pliku, aby zatrzymać te błędy zaśmiecające terminal, użyj

rmdir * 2> /dev/null
zła
źródło
Nie jest to odpowiednie dla skryptów, ponieważ zakończy działanie z niezerowym kodem stanu, ale działa.
the_drow
@ therow, jak to się nie nadaje? Przy okazji możesz także użyć rmdir * 2>/dev/null || true. (Sposób na znalezienie (1) jest lepszy do pisania skryptów, ale z innego powodu: ponieważ lepiej wyraża to, co chcesz zrobić.)
Alois Mahdal
Często robię to w $HOME. Ze złym uśmiechem.
Alois Mahdal
Ponieważ zgłosi awarię, jeśli niektóre katalogi nie są puste.
the_drow
czy to jest szybsze niż metoda znajdowania? Czy ktoś porównał te dwa?
Xerus
1
find . -type d -empty -delete -maxdepth 1

Bo jeśli chcesz tylko usunąć bezpośrednie podkatalogi z foo/.

Simon Baars
źródło
0

Podejście do Pythona

$ tree                                                                                                                                                                                  
.
├── empty_dir1
├── empty_dir2
├── subdir1
│   ├── file1.abc
│   └── file2.abc
└── subdir2
    ├── file1.abc
    └── file2.abc

4 directories, 4 files
$ python -c 'import os;empty=[r for r,s,f in os.walk(".") if not f and not s and r != "." ];map(lambda x: os.rmdir(x),empty)'
$ tree
.
├── subdir1
│   ├── file1.abc
│   └── file2.abc
└── subdir2
    ├── file1.abc
    └── file2.abc

Działa to tak:

  • używamy os.walk()funkcji do rekurencyjnego chodzenia po drzewie katalogów. Na każdej iteracji rustawiony jest bieżący folder, do którego uzyskujemy dostęp, szawiera listę katalogów wewnątrz ri fbędzie zawierać listę plików w tym folderze. Oczywiście, jeśli fi ssą puste, wiemy, że rjest puste.
  • pierwsze zrozumienie listy pozwala nam stworzyć emptylistę wszystkich katalogów, które są puste, na podstawie oceny podanej powyżej.
  • druga funkcja map()służy do wykonywania os.rmdir()każdej pozycji na emptyliście. Zrozumienie listy może być wykorzystane jako alternatywa.

Jako skrypt byłby to tak:

#!/usr/bin/env python
import os
empty=[]
for r,s,f in os.walk("."):
    if not f and not s and r != ".":
        empty.append(r)

for i in empty:
    os.rmdir(i)
Sergiy Kolodyazhnyy
źródło
zbyt skomplikowane na zwykłe pytania :(
nurulhudamustaqim
@nurulhudamustaqim Zależy od punktu widzenia. Dla wielu użytkowników Linuksa, którzy są przyzwyczajeni do Pythona, jest to w rzeczywistości bardzo skromny :) A poza tym różnorodność. Współczesna administracja systemem nie ogranicza się tylko do bashu lub /bin/shtylko, a Python jest w rzeczywistości bardziej eleganckim językiem niż te dwa
Sergiy Kolodyazhnyy