Вам нужны двойные кавычки вокруг переменных и подстановка команд, чтобы пробелы в имени файла не были приняты за разделители аргументов. Кроме того, вам не нужен sed, так как bash может сам заменить персонажа:
mv "$1" "${1// /_}"
Редактировать: со мной произошло еще несколько вещей. Во-первых, вам действительно следует использовать mv -i
на тот случай, если уже есть файл с подчеркиванием ("a_e_i" или что-то еще). Во-вторых, это работает только с простыми именами файлов - если вы указываете путь к файлу с пробелами во вложенном каталоге (например, «foo bar / baz quux / aei»), он пытается переименовать его в каталог с преобразованными пробелами, который не существует, что приводит к комедии. Итак, вот предложенная лучшая версия:
mv -i "$1" "$(dirname "$1")/$(basename "${1// /_}")"
Кстати, другие ответы исключают двойные кавычки в имени файла после замены пробелов подчеркиванием - это не совсем безопасно, так как есть другие забавные символы, которые все еще могут вызывать проблемы. Правило 1: если есть сомнения, оберните его в двойные кавычки для безопасности. Правило 2: сомневайся.