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
find
Polecenie 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 -empty
opcja obowiązuje dla każdego pustego pliku i katalogu.
-type d
Opcja odnosi się do pliku typu określonego; w tym przypadku d
oznacza katalog typu pliku .
-delete
Opcja 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 -r
opcja oznacza rekurencyjne usuwanie, a -f
polecenie oznacza, że nie pytaj przed usunięciem. Jeśli chcesz otrzymać monit przed usunięciem katalogu / pliku, zamień -f
opcję na -i
opcję.
stdout
jedną komendę (np. find
) Do stdin
drugiej (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 man
strony 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 rmdir
odmowy polecenia usunięcia niepustych katalogów oraz find -depth
opcji przejścia od dołu do góry drzewa katalogów:
find . -depth -exec rmdir {} \;
(i zignoruj błędy) lub dołącz, 2>/dev/null
aby naprawdę je zignorować.
-depth
Możliwość find
startów znalezienie u dołu drzewa katalogów.
rm -rf
usunie 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 r
ustawiony jest bieżący folder, do którego uzyskujemy dostęp, s
zawiera listę katalogów wewnątrz r
i f
będzie zawierać listę plików w tym folderze. Oczywiście, jeśli f
i s
są puste, wiemy, że r
jest puste.empty
listę 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 empty
liś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/sh
tylko, a Python jest w rzeczywistości bardziej eleganckim językiem niż te dwa