Řešení 1:
Odstraňte *
. Jak je uvedeno v manuálových stránkách rsync --delete
volba nefunguje se zástupnými znaky.
Místo toho použijte toto:
rsync -a --delete $DIR1/ $DIR2/
"--deleteThis říká rsync, aby smazal nadbytečné soubory ze strany příjemce (ty, které nejsou na straně odesílatele), ale pouze pro adresáře, které se synchronizují. Museli jste požádat rsync o odeslání celého adresáře ( např. dir
nebo dir/
) bez použití zástupného znaku pro obsah adresáře (např. dir/*
), protože zástupný znak je rozbalen shellem a rsync tak dostane požadavek na přenos jednotlivých souborů, nikoli nadřazeného adresáře souborů. Soubory, které jsou vyloučeny z přenosu, jsou také vyloučeny z odstranění, pokud nepoužijete --delete-excluded
nebo označte pravidla jako vyhovující pouze na straně odesílatele (viz modifikátory zahrnout/vyloučit v sekci FILTROVAT PRAVIDLA)."
Řešení 2:
Důvodem je to, že voláte rsync na /tmp/1/b, který nebude brát v úvahu soubor /tmp/1/a.
Zdá se, že vaším záměrem je rsyncovat adresář /tmp/1/ -- pokud jako zdroj použijete "/tmp/1/" místo jednotlivých souborů, všimne si, že "a" bylo smazáno z adresáře a odstraní to z cíle.
Řešení 3:
Pokud změníte druhý řádek rsync na rsync -a --delete $DIR1/ $DIR2
(bez *) to bude fungovat. Důvodem je, že shell rozšiřuje *
na názvy souborů v prvním adresáři, což je ve vašem případě pouze b, takže chybějící soubor a rsync vůbec nezohlední, protože příkaz, který se provede, je ve skutečnosti rsync -a --delete $DIR1/b $DIR2
.