У меня есть каталог, заполненный множеством файлов, в некоторых из которых есть скобки; например a(file).ext, an(other)file.ext и т. Д. Моя цель - переименовать их примерно так: a_file_.ext или an?other?file.ext. (неважно, какой персонаж).

Причина этого в том, что некоторые консольные приложения не могут работать с этими скобками и думают, что это какая-то команда.

Вещи, которые я уже пробовал:

$ rename ( ? *(*
$ for f in *(*; do mv $f ${f//(/?}; done
$ for f in "*(*"; do mv $f ${f//\"(\"/\"?\"}; done

И тому подобное. Возможно, я не понимаю этих функций переименования. (Я знаю, что они работают только для "(" и что мне нужно повторить их еще раз для ")"). Так может ли кто-нибудь дать дополнительные пояснения по поводу его синтаксиса и почему он не работает?

Все в Баше.

1
KoneLinx 12 Ноя 2017 в 01:09

1 ответ

Лучший ответ

Рассмотреть:

(shopt -s nullglob; for f in *[\(\)]*; do mv "$f" "${f//[()]/_}"; done)
  • ( и ) - это синтаксис, и их необходимо экранировать, чтобы однозначно называть их литералами.
  • Установка опции nullglob заставляет глобус расширяться до нуля, а не до самого себя, если файлы не совпадают. Помещение кода в подоболочку предотвращает сохранение этого изменения конфигурации за пределами одной команды.
  • Использование кавычек вокруг расширений обязательно, если вы не хотите, чтобы эти расширения подвергались разбиению на строки и глобализации.
5
Charles Duffy 11 Ноя 2017 в 22:24