Не анализируйте имена файлов с помощью 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
Так что, возможно, положение дефиса вызвало вашу проблему, когда вы добавили пробел. Но совет не разбирать имена файлов стоит!