У меня есть группа файлов с именами типа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
опция выводит только то, что было бы переименовано.