Find files with illegal windows characters in the name on Linux

This find one-liner should work for you:

find . -name "*[<>:\\|?*]*" -exec bash -c 'x="{}"; y="$(sed "s/[<>:\\|?*]\+/-/g" <<< "$x")" && mv "$x" "$y" ' \;

Neither of the answers above finds files or directories that ended in either space (' ') or period/dot ('.') which are also not visible with Win32 API.

Adding to .e.g @falsetru's answer, one could do

find . -name '*[<>:/\\|?*]*' -o -name '*[ \.]'

fnmatch pattern allow you to specify that characters in [] as follow:

find . -name '*[<>:/\\|?*]*'