Powiedz, że mam katalog o nazwie foo/. Ten folder zawiera podkatalogi. Jak mogę usunąć wszystkie puste katalogi za pomocą jednego polecenia?
Powiedz, że mam katalog o nazwie foo/. Ten folder zawiera podkatalogi. Jak mogę usunąć wszystkie puste katalogi za pomocą jednego polecenia?
Odpowiedzi:
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.
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ę.
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.
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.
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
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ć.)
$HOME. Ze złym uśmiechem.
find . -type d -empty -delete -maxdepth 1
Bo jeśli chcesz tylko usunąć bezpośrednie podkatalogi z foo/.
$ 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:
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.emptylistę wszystkich katalogów, które są puste, na podstawie oceny podanej powyżej.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)
/bin/shtylko, a Python jest w rzeczywistości bardziej eleganckim językiem niż te dwa