W starej wersji Uniksa rm
polecenie usuwałoby katalogi, gdyby były puste. Ze strony podręcznika Research Unix Eighth Edition dla rm : „Jeśli wpis jest katalogiem, jest usuwany tylko wtedy, gdy jest pusty”. Podoba mi się to zachowanie, więc mam ten alias /etc/profile
: alias rm='rm -d'
używam wersji GNU coreutils rm
, w której -d
każe rm
iść do przodu i usuwać katalogi, jeśli są puste.
Na razie w porządku. Ten alias pozwala mi używać rm
jak za dawnych czasów. Chciałbym jednak pójść o krok dalej. chciałbymrm
aby usunąć katalog, nawet jeśli katalog zawiera inne katalogi, o ile katalogi są tam jedyne. Nie ma znaczenia, jak głęboka jest struktura katalogów, o ile nie ma tam żadnych plików, po prostu puste (po przejściu na dół) katalogi, chciałbym rm
je wszystkie usunąć.
Czy można to zapisać jako alias, który nadal działałby jako zwykły rm
i usuwał wszelkie przekazywane do niego pliki?
rmdir -p
?mkdir -p a/b1/c2 && mkdir -p a/b2/c2; rmdir -p a/b1/c1;
, wciąż pozostanie mi a, a / b2 i a / b2 / c2. Chciałbym przekazać tylko najwyższy poziom (w tym przypadku a)rm
i usunąć wszystko poniżej.Odpowiedzi:
Chcesz przejść przez drzewo katalogów i sprawdzić, czy zawiera ono coś innego niż katalog. To jest poza
rm
możliwościami. Potrzebujesz innych narzędzi, takich jakfind
. W ten sposób możesz usunąć puste katalogi w danym katalogu (-depth
powoduje również usunięcie katalogów nadrzędnych, które stają się puste):Oto funkcja, która dla każdego argumentu usuwa argument, jeśli jest to plik spoza katalogu lub drzewo katalogów nie zawierające niczego innego niż katalogi. Zauważ, że ta funkcja nie jest atomowa: jeśli jeden z argumentów zmieni się podczas działania, możesz skończyć z komunikatem o błędzie, ale jest bezpieczny, ponieważ nie usunie żadnego katalogu poza katalogiem przekazanym jako argument.
źródło