Избегайте замены пробелов при переименовании файлов

Я пытаюсь переименовать файлы следующим образом:

for file in *;
do
mv -i "$file" "$(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g')";
done

Но команда sed заменяет все пробелы на _.

Как мне отредактировать команду sed, чтобы она содержала пробелы вместе с указанными символами? Я пытался использовать \s, но он не работает ...

РЕДАКТИРОВАТЬ:
Например: файл trip: hill должен быть переименован: trip_ hill, но приведенная выше команда делает его trip__hill.

10
задан 22 December 2017 в 18:03

2 ответа

Не разбирать имена файлов с помощью sed! Вывод echo "$file" может быть ненадежным.

Использовать rename. 17.10 Вам необходимо сначала установить его

sudo apt install rename

Затем:

rename -n -- 's/[^-A-Za-z0-9_ .]/_/g' *

Notes

  • удалить -n после тестирования, чтобы фактически переименовать файлы
  • -- конец опций, если любой файл начинается с -
  • [^-A-Za-z0-9_ .] символов, которые мы не хотим заменять - ставьте - первым или последним, чтобы он мог ' t указывает диапазон (он трактуется буквально в этих позициях).
  • Пробелы могут быть включены в класс
  • . трактуется буквально (в других контекстах регулярных выражений он обозначает любой символ и должен быть экранирован).

Это также работает в 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

Так что, возможно, положение дефиса вызвало вашу проблему, когда вы добавили пробел. Но совет не разбирать имена файлов стоит!

11
ответ дан 22 December 2017 в 18:03

Вы также можете просто использовать оболочку, Расширение параметра Bash может выполнять подстановку:

for f in ./* ; do
    mv "$f" "${f//[^-A-Za-z0-9._ ]/_}"
done

Двойная косая черта говорит ему заменить все совпадения, кроме этого, синтаксис простой.

2
ответ дан 22 December 2017 в 18:03

Другие вопросы по тегам:

Похожие вопросы: