You can do a for loop script using sed. I created two filenames with special characters for this example
a_ weird ^? filename.mp3
This is #$ a _ test file
for i in *; do echo mv "$i" "$(echo $i | sed 's/[!@#\$%^&*()?_]//g' | tr -s " ")"; done
mv a_ weird ^? filename.mp3 a weird filename.mp3
mv This is #$ a _ test file This is a test file
The original filename is in black and the new filename is in red
Whatever character(s) you want omitted, just insert it between the brackets i.e in bold
It is good to use echo to preview the results before committing the actual conversion. If satisfied with the preview, then remove the echo in blue.
This is optional. If you want to capitalize the first character in each word, then add an extra sed statement.
for i in *; do echo mv "$i" "$(echo $i | sed 's/[!@#\$%^&*()_?]//g;s/^.\| [Aa-Zz]/\U&/g' | tr -s " ")"; done
mv a_ weird ^? filename.mp3 A Weird Filename.mp3
mv This is #$ a _ test file This Is A Test File
The new filenames have each word capitalized and weird characters removed.
The new sed statement is in bold
Hope this helps. Remember keep the echo part to preview the results. Then remove it to make the real changes.