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ć?
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-excluded
opcja zapewnia usunięcie nawet wykluczonych plików po stronie DEST.
--delete-excluded
. Bez niego tylko*.jpg
i*.txt
moż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ć .