1

У меня есть группа файлов с именем title_de December_word1_word2.png, и я хочу перебрать каталог и поменять местами word1 и word2 в каждом файле.

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

Любое предложение о том, как я мог бы сделать это?

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

2 ответа2

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

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


rename стиле Perl

На OS X вы можете получить rename с помощью Homebrew:

$ 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 печатает только то, что было бы переименовано.

1

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

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

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .