Załóżmy, że mam takie drzewo katalogów:
ROOTDIR
└--SUBDIR1
└----SUBDIR2
└----SUBDIR3
Szukam polecenia takiego, że kiedy wprowadzę:
$ [unknown command] ROOTDIR
Całe drzewo katalogów można usunąć, jeśli nie ma pliku, ale tylko katalogi wewnątrz całego drzewa . Powiedzmy jednak, że w pliku SUBDIR1 znajduje się plik hello.pdf:
ROOTDIR
└--SUBDIR1
└--hello.pdf
└----SUBDIR2
└----SUBDIR3
Następnie polecenie musi usunąć tylko SUBDIR2 i poniżej.
Odpowiedzi:
Alexis jest blisko. Co musisz zrobić, to:
Spowoduje to najpierw drążenie w dół drzewa katalogów, aż znajdzie pierwszy pusty katalog, a następnie usunięcie go. W ten sposób opróżnianie katalogu nadrzędnego, który zostanie następnie usunięty itp. Spowoduje to pożądany efekt (robię to prawdopodobnie 10 razy w tygodniu, więc jestem pewien, że ma rację). :-)
źródło
-depth
opcja jest konieczna?find . -type d -empty -exec rmdir "{}" \;
powinien również działać .... prawda?foo/bar/baz
. O ile nie użyjesz-depth
, spróbujefoo
najpierw usunąć , nie powiedzie się, a skończyszfoo/bar
po uruchomieniu.+
zamiast,;
aby partii usunąć katalogi. Ponieważ robisz to w pierwszej kolejności, dzieci będą nadal usuwane przed rodzicami (być może zależy to od twojej wersji rmdir / bash i zależą od rmdir, który nie usuwa niepustych katalogów). Działa to dla mnie w bash na cygwin:mkdir -p a/b/c/d ; find a -depth -type d -exec rmdir {} +
taki sam jak
ale używa wbudowanej akcji „-delete”.
Zauważ, że „-delete” oznacza „-depth”.
źródło
Spróbowałbym tego:
źródło
Oto niektóre wymagania, zanim będziemy mogli to zrobić bezpiecznie:
Oto jak zrobiłbym to w powłoce:
Jeśli nie przeszkadzają ci jakieś zbędne błędy, możesz po prostu wymusić usunięcie wszystkich katalogów z rodzicami i nie musisz przeprowadzać żadnego sortowania (nie możesz sortować NUL zakończonych ciągów, co dodaje konieczność tr)
źródło
-empty -delete
opcjach odpowiedzifind
w @ go2null.źródło
find
ponieważfind
ma sposób, aby wykonać obróbkę czysto:find … -exec
.Zrobiłbym to:
źródło