Se você não copiar os diretórios recursivamente com o argumento -r , cp não criará diretórios intermediários para você. (apenas adicionar -r não funcionará; não tem efeito a menos que a fonte seja um diretório).
Você pode tentar a opção -r do GNU ln ("criar links relativos") e criar você mesmo os diretórios intermediários com mkdir -p {dirname} . Exemplo:
# usage mklinks from to [opts/predicates for find ..]
mklinks(){
from=$1; shift
to=$1; shift
find "$from" -type f "$@" -print0 | from=$from to=$to gxargs -0 sh -c '
for a; do
t="$to/${a#$from}"; b=${t##*/}
mkdir -vp "${t%$b}" && gln -vrs "$a" "$t"
done
' sh
}
mklinks ../../1/a . \! -name '*data*'
Claro, se você estiver no Linux, altere gxargs para xargs e gln para ln .