我有一组名为的文件标题_十二月_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
Zsh 和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
$ 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
选项仅打印已重命名的内容。