простой скрипт bash для замены пробелов на подчеркивания в имени файла - PullRequest
1 голос
/ 22 июля 2011
mv $1 $(echo $1 | sed s:\ :_:g)

Это простой скрипт, который переименовывает файл, передаваемый в качестве аргумента, заменяя пробелы на подчеркивания.Однако, когда я пытаюсь переименовать файл «aei», например, в «a_e_i», он возвращает следующую ошибку:

./spc2und a\ e\ i 
mv: target `a_e_i' is not a directory

Ответы [ 3 ]

7 голосов
/ 22 июля 2011

Вам нужны двойные кавычки вокруг переменных и подстановка команд, чтобы пробелы в имени файла не были приняты за разделители аргументов. Кроме того, вам не нужен sed, так как bash может сам заменить персонажа:

mv "$1" "${1// /_}"

Редактировать: со мной произошло еще несколько вещей. Во-первых, вам действительно следует использовать mv -i на тот случай, если уже есть файл с подчеркиванием ("a_e_i" или что-то еще). Во-вторых, это работает только с простыми именами файлов - если вы указываете путь к файлу с пробелами во вложенном каталоге (например, «foo bar / baz quux / aei»), он пытается переименовать его в каталог с преобразованными пробелами, который не существует, что приводит к комедии. Итак, вот предложенная лучшая версия:

mv -i "$1" "$(dirname "$1")/$(basename "${1// /_}")"

Кстати, другие ответы исключают двойные кавычки в имени файла после замены пробелов подчеркиванием - это не совсем безопасно, так как есть другие забавные символы, которые все еще могут вызывать проблемы. Правило 1: если есть сомнения, оберните его в двойные кавычки для безопасности. Правило 2: сомневайся.

5 голосов
/ 22 июля 2011

попробуйте это - чистый bash:

mv "$1" ${1// /_}
2 голосов
/ 22 июля 2011

Ваш $ 1 расширяется до e e i, который затем используется как первые три аргумента для mv, поэтому ваш вызов становится

mv a e i a_e_i

По этой причине вы получаете сообщение об ошибке. Чтобы это исправить, все, что вам нужно сделать, это указать $ 1:

mv "$1" $(echo "$1" | sed s:\ :_:g)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...