rsync é uma ferramenta poderosa, mas, infelizmente, é estranhamente exigente em alguns de seus nomes de caminho.
Se $DATA for um caminho absoluto (ou seja, começa com / ), a linha de comando correta a ser usada é:
rsync -a --link-dest=$DATA $DATA/ $DATA/../upgrade_tmp
[Agora, apenas um breve resumo sobre a estranheza de rsync . Observe o / à direita adicionado ao argumento de origem. Isso diz a rsync para trabalhar com o conteúdo do diretório de origem, em vez de usar o próprio diretório de origem. (Eu estou supondo que $DATA não contém um / ). Nesse caso, queremos trabalhar com o conteúdo, então adicionamos o / .]
Se, por outro lado, $DATA for um caminho relativo (isto é, ele não começa com / ), então o comentário de Sean R sobre --link-dest está ativado: O caminho link-dest é interpretado como relativo para o caminho destino , assim você usaria o seguinte:
rsync -a --link-dest=../'basename $DATA' $DATA/ $DATA/../upgrade_tmp
EDITAR
Uma observação final é que a segunda linha de comando rsync que eu dei deve funcionar independentemente de $DATA ser um caminho absoluto, pois basename não se importa se um caminho é absoluto ou relativo.