Korzystam z rsync do niezbędnego pobierania plików z serwera, a następnie usuwam pliki z serwera, gdy już je mam lokalnie. Pełne polecenie, które uruchamiam, znajduje się poniżej.
Powoduje to usunięcie plików na serwerze źródłowym, jednak nadal pozostają puste katalogi. Nie otrzymuję żadnych wiadomości ani błędów. Wszystkie dane wyjściowe są normalne. Być może jest to zamierzona funkcjonalność.
Jak mogę nakazać rsync wyczyścić wszystko, w tym katalogi?
rsync --progress -vrzh --remove-source-files
Wersja jest 3.0.9 na obu końcach.
Odpowiedzi:
Zachowanie
--remove-source-files
, które obserwujesz, jest dokładnie takie, jak określone przezman rsync
:Nie ma konkretnego polecenia do usunięcia katalogów, ponieważ te dwie dyskusje w StackExchange i ServerFault wyraźnie pokazują. Rozwiązanie sugeruje wydanie dwóch osobnych poleceń:
Ostatni fragment polecenia sugerowany w tych dwóch postach,
który jest potrzebny do usunięcia (teraz opróżnionego) katalogu źródłowego, ma ten formularz w tych postach, ponieważ OP i odpowiedzi używają rsync do przenoszenia dużych ilości plików na tym samym komputerze. W twoim przypadku będziesz musiał to zrobić ręcznie.
źródło
rsync --delete
Sugestia jest niebezpieczne, ponieważ ignoruje możliwość, że rsync nie została zakończona, czy istnieją nowe pliki u źródła. Metoda @ slhckfind
poniżej jest znacznie bezpieczniejsza.Strona podręcznika mówi nawet:
Jeśli chcesz usunąć puste katalogi ze źródła, jeśli nadal pozostały pliki, wykonaj:
Ale w przypadku pustego katalogu głównego
rm -rf <directory>
wystarczy oczywiście wola.źródło
find some_dir -depth -type d -empty -not -path some_dir -delete
Użycie „ rm -rf ” ma nieodłączny warunek wyścigu, możesz mianowicie usunąć pliki, które zostały właśnie utworzone między wywołaniami rsync i rm .
Wolę używać:
NIE spowoduje to usunięcia katalogów, jeśli nie są puste.
źródło
rm -rf
Również usunąć pliki, które nie zostały przeniesione z jakiegoś powodu.-depth
opcji, która nakazujefind
przetwarzanie we właściwej kolejności. W wyniku tego braku katalogi zawierające tylko puste katalogi (ewentualnie rekurencyjnie) nie zostaną usunięte. Wariant @slhck ma rację.-m, --prune-empty-dirs
przycinaj puste łańcuchy katalogów z listy plików--force
wymusić usunięcie katalogów, nawet jeśli nie są pusteźródło
Usuń pliki źródłowe, a następnie usuń katalogi, aby zachować bezpieczeństwo.
źródło