Не розбирайте імена файлів із sed! Вихідні дані echo "$file"не можуть бути надійними.
Використовуйте rename. 17.10 потрібно спочатку встановити його
sudo apt install rename
Тоді:
rename -n -- 's/[^-A-Za-z0-9_ .]/_/g' *
Примітки
- видаліть
-nпісля тестування, щоб фактично перейменувати файли
-- end-of-options у випадку, якщо починається який-небудь файл -
[^-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
Тож можливо позиція дефіса викликала вашу проблему, коли ви додали пробіл. Але порада не розбирати імена файлів стоїть!