Usunąć zbędne pliki z katalogu docelowego przez rsync?

51

Powiedz, że mam

SRC 
  001.jpg
  002.jpg
  001.txt
  a.zip

DEST
  hello.jpg

rsync -d --delete SRC:{*.jpg,*.txt} DEST

Nie usuwa hello.jpg z DEST, jakiś pomysł, jak to zarchiwizować?

Cheng
źródło

Odpowiedzi:

72

Powód, dla którego twoje polecenie nie działa, wyjaśniono na stronie podręcznika rsync (wyróżnienie dodane):

--usunąć

To mówi rsyncowi, aby usunął niepotrzebne pliki ze strony odbierającej (te, które nie są po stronie wysyłającej), ale tylko dla synchronizowanych katalogów. Musisz poprosić rsync o wysłanie całego katalogu (np. „Dir” lub „dir /”) bez użycia symbolu wieloznacznego dla zawartości katalogu (np. „Dir / *”), ponieważ znak wieloznaczny jest rozszerzany przez powłokę, a zatem rsync otrzymuje żądanie przesłania pojedynczych plików, a nie katalogu nadrzędnego plików. Pliki wykluczone z transferu są również wykluczone z usunięcia, chyba że użyjesz opcji --delete-wykluczyć lub zaznaczysz reguły jako pasujące tylko po stronie wysyłającej (zobacz modyfikatory włączania / wyłączania w sekcji ZASADY FILTRA).

Kiedy więc biegniesz

$ rsync -d --delete SRC:{*.jpg,*.txt} DEST

niechciane pliki w DEST nie są usuwane, ponieważ tak naprawdę nie poprosiłeś o zsynchronizowanie katalogu, ale tylko o kilka konkretnych plików. Aby uzyskać pożądane wyniki, spróbuj czegoś takiego:

rsync -d --delete-excluded --include '*.jpg' --include '*.txt' --exclude '*' SRC/ DEST/

Zauważ, że kolejność włączania i wyłączania dyrektyw ma znaczenie. Zasadniczo każdy plik jest sprawdzany względem wzorców dołączania lub wykluczania w kolejności, w jakiej się pojawiają. Dlatego pliki z rozszerzeniami .jpg lub .txt są synchronizowane, ponieważ pasują do wzorców „dołączonych”, zanim dopasują wzorce wykluczone „*”. Wszystko inne jest wykluczone przez --exclude '*'wzorzec. Ta --delete-excludedopcja zapewnia usunięcie nawet wykluczonych plików po stronie DEST.

Steven D.
źródło
@Cheng, chcesz wyjaśnić nieco więcej? Z przyjemnością zaktualizuję odpowiedź, jeśli wystąpi problem / poprawa.
Steven D.
To działa. Zgaduję. Procesy mnie dezorientują, sprawiły, że pomyślałem, że zostały ponownie przekazane.
Cheng,
Zredagowałem swoją odpowiedź, aby wyjaśnić nieco więcej.
Steven D
2
@Cheng: Podejrzewam, że nie chcesz --delete-excluded. Bez niego tylko *.jpgi *.txtmożna je usunąć po stronie docelowej. Dzięki temu niepowiązane pliki również zostałyby usunięte. Ten samouczek na temat filtrów rsync może Cię zainteresować .
Gilles „SO- przestań być zły”
3
Dzięki! Dla mnie brakowało końcowego ukośnika w katalogu źródłowym.
vaughan