Encontré un bash one-liner que encuentra cada archivo y carpeta con caracteres no válidos en el nombre y cambia el nombre del archivo / carpeta, cambiando cada carácter no válido a un guión:
find . -name "*[<>:\|?*]*" -exec bash -c 'x="{}"; y=$(sed "s/[<>:\|?*]\+/-/g" <<< "$x") && mv -n "$x" "$y" ' \;
Es posible que un archivo tenga un nombre ilegal que se corregiría con el mismo nombre legal que otro archivo con nombre ilegal (Ejemplo: dos archivos con el nombre "fle"). La línea de una línea anterior no cambiará el nombre del segundo (o más) archivo con nombre ilegal que se corregirá con el mismo nombre que el primero. Esto significa que es posible que aún tenga algunos archivos con nombres ilegales después de que se ejecute one-liner. Después de ejecutar este one-liner, ejecute
find . -name "*[<>:\|?*]*"
de nuevo para identificar los archivos con nombres ilegales que aún existen. Una forma de lidiar con esta situación es cambiar el guión en la sustitución sed a otro personaje, por ejemplo. subrayar y ejecutar el one-liner de nuevo.