Скрипт пакетного переименования файлов меняет местами подстроки в имени файла?

Скрипт пакетного переименования файлов меняет местами подстроки в имени файла?

У меня есть группа файлов с именами типаtitle_december_word1_word2.pngи хотите выполнить итерацию по каталогу и подкачку word1внутри word2каждого файла.

т.е. перейти от button_december_state_pressed.png->button_december_pressed_state.png

Есть ли у вас какие-нибудь предложения, как это можно сделать?

Большинство пакетных программ, которые я нашел для OS X, не могут указать символ для разбиения слов, и я надеялся, что кто-нибудь сможет помочь мне с быстрым скриптом для решения этой проблемы.

решение1

В bash это можно сделать следующим образом:

  for i in *; do echo $i | awk -F'[_.]' '{print $1"_"$2"_"$4"_"$3 }' ; done

Эта команда сначала находит все файлы в текущем каталоге, а затем передает эти имена (предполагается, чтобез проверки(в именах этих файлов есть три подчеркивания и точка .) в awk, который переставляет их в желаемом вами порядке.

Единственная сложная часть заключается в том, что -F'[_.]'опция -F' 'используется для определения разделителя между различными полями, и в этом последнем случае разделитель принимает свое значение по умолчанию — пробел. Но опция -F'[_.]'определяет класс символов взаимозаменяемых элементов, в данном случае подчеркивание и точку, которые можно использовать по желанию в качестве разделителей.

Редактировать:

Хорошо, поскольку это работает, то, фактически ничего не перемещая, мы теперь можем реализовать сам процесс переименования файлов:

  for i in *; do ni=$(echo $i | awk -F'[_.]' '{print $1"_"$2"_"$4"_"$3"."$5 }') && mv "$i" "$ni" ; done

решение2

Зш иzmv

Если у вас есть zsh (который идет по умолчанию в OS X), вы можете использоватьzmv:

% zsh
% autoload -U zmv
% zmv 'title_december_(*)_(*).png' 'title_december_$2_$1.png'

Запустите следующую команду (используйте zmv -nдля пробного запуска без фактического переименования):

mv -- title_december_word1_word2.png title_december_word2_word1.png

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

% zmv '(*)_(*)_(*).png' '$1_$3_$2.png' 
mv -- foo_bar_word1_word2.png foo_bar_word2_word1.png
mv -- title_december_word1_word2.png title_december_word2_word1.png

Это работает, потому что совпадения являются «жадными» и поэтому поглощают все подчеркивания вплоть до последнего перед другими группами совпадений.


Perl-стильrename

На OS X вы можете получитьrenameсДомашнее пиво:

$ rename -n 's/(.*)_(.*)_(.*).png/$1_$3_$2.png/' *
'foo_bar_word1_word2.png' would be renamed to 'foo_bar_word2_word1.png'
'title_december_word1_word2.png' would be renamed to 'title_december_word2_word1.png'

Эта -nопция выводит только то, что было бы переименовано.

Связанный контент