Zapobiegaj przechodzeniu rmdir -p powyżej określonego katalogu

1

Skasowałem ten skrypt do rsync niektóre pliki się skończyły ssh. The --remove-source-files opcja rsync zdaje się usuwać przesyłane pliki, czego chcę. Jednak chcę również, aby katalogi, w których te pliki zostały umieszczone, również zniknęły.

Aktualna część find dowództwo, -exec rmdir -p {} ; próbuje usunąć katalog nadrzędny (w tym przypadku /srv/torrents ), ale nie działa, ponieważ nie ma odpowiednich uprawnień. Chciałbym tylko przestać rmdir od przechodzenia nad katalogiem find jest uruchamiany lub znajdź inne rozwiązanie, aby pozbyć się wszystkich pustych folderów. Myślałem o użyciu jakiejś pętli find i działa rmdir bez -p przełącznik, ale myślałem, że to nie zadziała.

Głównie, czy istnieje alternatywny sposób usunięcia wszystkich pustych katalogów w katalogu nadrzędnym?

#!/bin/bash

HOST='<hostname>'
USER='<username>'
DIR='<destination directory>'
SOURCE='/srv/torrents/'

rsync -e "ssh -l $USER" --remove-source-files -h -4 -r --stats -m --progress -i $SOURCE $HOST:$DIR
find $SOURCE -mindepth 1 -type d -empty -prune -exec rmdir -p \{\} \;
squircle
źródło

Odpowiedzi:

1

Możesz wykorzystać ten fakt rmdir nie usunie niepustego katalogu:

rmdir {,.}?*/ 2>/dev/null

lub, jeśli twoja wersja rmdir ma opcję:

rmdir --ignore-fail-on-non-empty {,.}?*/

Dziwnie wyglądający glob rozszerza się, obejmując zwykłe katalogi i ukryte katalogi, ale wyklucza . i ...

Nie musisz używać find chyba że musisz dostać się do katalogów poniżej obecnego poziomu.

Edytować:

Próbować:

find -type d -empty -delete

Czyni to wyszukiwanie po raz pierwszy i usuwa wszystkie puste zagnieżdżone katalogi.

Dennis Williamson
źródło
@Dennis: Ale to nie usunie pustych katalogów pod bieżącym poziomem (np. Jeśli ./foo/bar/baz/ wszystkie są pustymi folderami, nie usuwają ich.) Potrzebuję czegoś, co dostanie się do katalogów poniżej obecnego poziomu, dlatego używam find.
squircle
@thepurplepixel: Zobacz moją edycję.
Dennis Williamson
Podobnie jak dla przyszłych osób czytających to pytanie, edytowane polecenie wymaga -mindepth 1 parametr, więc nie usuwa katalogu nadrzędnego.
squircle
@thepurplepixel: Prawdopodobnie jest to bezpieczniejsze, ale właśnie przetestowałem go i nie usunął katalogu nadrzędnego (bieżącego). mkdir test; cd test; mkdir sub; find -type d -empty -print -delete; cd ..; ls -ld test; ls -lR test. Nadal tam („sub” już nie ma). Katalog „test” nie jest pusty, dopóki jego zawartość nie zostanie usunięta (głębokość). Teraz zrób cd test; find -type d -empty -print -delete; cd ..; ls -ld test; ls -lR test (uruchom ponownie, gdy „test” jest już pusty). Wciąż tam.
Dennis Williamson
@Dennis: Może to być dla mnie inne, ponieważ określam dla niego określony katalog find biegać dalej ( find $DIR -mindepth 1 -type d -empty -delete )... kto wie? Wydaje się, że to działa dla mnie i to się liczy! :)
squircle
0

możesz także zrobić

find $SOURCE -mindepth 1 -type d -empty -prune -print0 | xargs -0 rm -rf
Mr Shunz
źródło
@MrShunz: Niestety, to też nie działa. Ma taki sam efekt jak odpowiedź Dennisa Williamsona. Nawet jeśli uruchomisz go dwa lub trzy razy, wydaje się, że tylko dwa katalogi są głębsze. W każdym razie dzięki.
squircle