I have a projects on my Linux box that contains file with characters that are considered illegal/reserved in Windows (http://msdn.microsoft.com/en-us/library/aa365247%28VS.8
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 '*[<>:/\\|?*]*'
This find one-liner should work for you:
find . -name "*[<>:\\|?*]*" -exec bash -c 'x="{}"; y="$(sed "s/[<>:\\|?*]\+/-/g" <<< "$x")" && mv "$x" "$y" ' \;