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

10

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

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

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

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

EDIT:
Например: файл trip: hill , должен быть переименован: trip_ hill , но команда выше делает trip__hill .

    
задан latach 22.12.2017 в 13:39
источник

2 ответа

12

Не разбирайте имена файлов с 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

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

    
ответ дан Zanna 22.12.2017 в 14:27
источник
2

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

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

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

    
ответ дан ilkkachu 25.12.2017 в 19:53