Переменная переменная подстановки Bash?

Возможный дубликат:
Пакетное переименование файлов

Я хочу переименовать файлы, используя их существующее имя в качестве базы для новой.

Поэтому, если я могу эти файлы с помощью

 ls blue*+(.png) 

Я бы хотел переименовать их что-то вроде

 mv blue$(*)+(.png) $(1).png 

за исключением того, что это не работает. Есть ли синтаксис для этих переменных в bash globbing или есть более простой способ?

4 Solutions collect form web for “Переменная переменная подстановки Bash?”

Портативный способ сделать это

 for f in blue*.png; do mv -- "$f" "${f#blue}"; done 

Все это требует mv и работает не только с bash но и с любой совместимой с POSIX оболочкой, которая поддерживает стандартное расширение параметра POSIX . Не требуется, чтобы ваша система имела zsh или определенную версию rename .

Я не вижу в этом легкого способа сделать это, но, конечно, вы можете разбить проблему на несколько шагов, например, нарезать префикс, вспомнить расширение и затем заменить несколько экземпляров расширения на один.

 for file in blue*+(.png); do tmp="${file#blue}"; extension="${file##*.}"; echo "$file" "${tmp/%+(.$extension)/}.$extension";done 

если вы довольны результатами, просто введите …

 ^echo^mv 

и все волшебство произойдет. 🙂

С bash:

 zsh -c ' autoload -U zmv zmv "blue(*).png" "\$1.png"' 

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

В Debian и деривативах (включая Ubuntu) есть команда переименования, которая может делать то, что вы хотите:

 rename -n "s/\+\.png/.png/" blue*+.png 

Удалите флаг -n после тестирования и примените переименование.

Эта команда rename – это Perl-скрипт, который нельзя путать с командой rename из пакета util-linux. Другие дистрибутивы могут предоставлять его как имя prename или rename.pl или вообще нет.

  • Fish-Shell не сохранит мои псевдонимы
  • du skip символические ссылки
  • Файлы Concat 1000 в каталоге
  • Как создать вопрос подтверждения в Linux?
  • Почему число округлено по ssh?
  • Проблема с пробелами при использовании в команде find
  • Файлы Cat 2 и избегайте дублирования строк
  • Как сохранить символ возврата каретки (\ n) при выходе вывода команды в переменную
  • Как я могу направить что-то меньше на ssh?
  • Почему порядок результатов подстановки может отличаться при использовании с терминалом или с perl?
  • Удалите файлы, которые предоставляются по каналу
  • Предоставление доступа к ограниченной оболочке git
  • Linux и Unix - лучшая ОС в мире.