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

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

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

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

 ls blue*+(.png) 

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

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

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

  • Почему эта команда Bash использует regex, не заменяя мои скобки?
  • Есть ли команда оболочки или утилита для вывода процесса кэширования?
  • Фоновые процессы смешивают порядок выполнения сценария оболочки
  • Как запустить скрипт с другого пути и узнать путь к скрипту?
  • Почему xargs пропускает первый аргумент при передаче в подоболочку?
  • Функция Shell, чтобы проверить, есть ли приостановленный процесс, являющийся дочерним элементом этой оболочки?
  • Отправить stdin в консольный и сжатый файл
  • почему grep ведет себя по-другому на моем домашнем ПК и офисном ПК
  • 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 или вообще нет.

    Linux и Unix - лучшая ОС в мире.