Esta búsqueda de una sola línea debería funcionar para usted:
find . -name "*[<>:\\|?*]*" -exec bash -c 'x="{}"; y="$(sed "s/[<>:\\|?*]\+/-/g" <<< "$x")" && mv "$x" "$y" ' \;
Ninguna de las respuestas anteriores encuentra archivos o directorios que terminaron en espacio (' ') o punto/punto ('.') que tampoco son visibles con la API de Win32.
Agregando a la respuesta de .e.g @falsetru, uno podría hacer
find . -name '*[<>:/\\|?*]*' -o -name '*[ \.]'
El patrón fnmatch le permite especificar los caracteres en []
como sigue:
find . -name '*[<>:/\\|?*]*'