Dieser Find-Einzeiler sollte für Sie funktionieren:
find . -name "*[<>:\\|?*]*" -exec bash -c 'x="{}"; y="$(sed "s/[<>:\\|?*]\+/-/g" <<< "$x")" && mv "$x" "$y" ' \;
Keine der obigen Antworten findet Dateien oder Verzeichnisse, die entweder mit Leerzeichen (' ') oder Punkt/Punkt ('.') enden, die auch mit der Win32-API nicht sichtbar sind.
Zu .e.g. @falsetrus Antwort hinzufügen, könnte man tun
find . -name '*[<>:/\\|?*]*' -o -name '*[ \.]'
Mit fnmatch-Muster können Sie diese Zeichen in []
angeben wie folgt:
find . -name '*[<>:/\\|?*]*'