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?

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.


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.


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

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


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)

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