Eu uso o Ubuntu, então não tenho ditto , mas o seguinte deve funcionar:
find $HOME -not \( -path "$HOME/Library" -prune \) \
-not \( -path "$HOME/Cache" -prune \) \
-not \( -path "$HOME/.Trash" -prune \) \
-name "*[<>:/|?#%\\]*" | while read -r; \
do cp --parent --preserve-all "${REPLY}" "$HOME/Cache/${REPLY/[<>:|?#%\]/-}"; \
done
Notas: -
- Eu espalhei o comando em várias linhas para legibilidade.
- Isso não faz exatamente o que você estava tentando alcançar: o acima substitui cada caractere inválido individual por
-, enquanto você tenta substituir cada seqüência de caracteres inválidos por um único-, embora ambos rendam Office- arquivos compatíveis. - Em geral, prefiro canalizar para
read, em vez de-exec bash /c ..., que precisa de muito cuidado com o uso de cotação e escape.