Не розбирайте імена файлів із 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
Тож можливо позиція дефіса викликала вашу проблему, коли ви додали пробіл. Але порада не розбирати імена файлів стоїть!