Не анализируйте имена файлов с помощью sed! Вывод echo "$file"может быть не надежным.
Использование rename. 17.10 сначала нужно установить
sudo apt install rename
Потом:
rename -n -- 's/[^-A-Za-z0-9_ .]/_/g' *
Заметки
- удалить
-nпосле тестирования, чтобы фактически переименовать файлы
-- конец опций, если любой файл начинается с -
[^-A-Za-z0-9_ .]символы, которые мы не хотим заменять - ставьте -первым или последним, чтобы он не мог указывать диапазон (он обрабатывается буквально в этих позициях).
- Пробелы могут быть включены в класс
. трактуется буквально (в других контекстах регулярных выражений он обозначает любой символ и должен быть экранирован).
Это также работает в sed:
$ echo 'trip: hill' | sed 's/[^-A-Za-z0-9 _.]/_/g'
trip_ hill
Если я добавлю пробел в конец вашей версии, я получу сообщение об ошибке:
$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._- ]/_/g'
sed: -e expression #1, char 22: Invalid range end
Но -в конце это работает:
$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._ -]/_/g'
trip_ hill
Так что, возможно, положение дефиса вызвало вашу проблему, когда вы добавили пробел. Но совет не разбирать имена файлов стоит!