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.