OSX:更改多个文件名中的日期格式

时间:2013-12-20 19:42:57

标签: regex macos command-line sed batch-rename

我有大量这种格式的文件(iPhone相机):

Photo 31-12-13 12 59 59.jpg

如何使用OSX命令行将这些文件批量重命名为此(ISO)格式:

2013-12-31 12 59 59.jpg

我尝试过使用下面的命令,但它似乎不起作用:

for i in Photo*
do
  mv "$i" "`echo $i | sed 's_Photo ([0-9]+)-([0-9]+)-([0-9]+) (.*)_\3-\2-\1 \4_/'`”
done

2 个答案:

答案 0 :(得分:1)

你有一个流浪的斜线。

sed的基本正则表达式需要大量的反斜杠。尝试其中一个

mv "$i" "$(echo "$i" | sed -r 's_Photo ([0-9]+)-([0-9]+)-([0-9]+)_\3-\2-\1_')"
mv "$i" "$(echo "$i" | sed 's_Photo \([0-9]\+\)-\([0-9]\+\)-\([0-9]\+\)_\3-\2-\1_')"

请注意,您不必捕捉行尾,只是为了不加改变地引用它。


该行尾的结尾双引号也不是简单的双引号:

$ od -c <<< '  mv "$i" "`echo $i | sed '\''s_Photo ([0-9]+)-([0-9]+)-([0-9]+) (.*)_\3-\2-\1 \4_/'\''`”'
0000000           m   v       "   $   i   "       "   `   e   c   h   o
0000020       $   i       |       s   e   d       '   s   _   P   h   o
0000040   t   o       (   [   0   -   9   ]   +   )   -   (   [   0   -
0000060   9   ]   +   )   -   (   [   0   -   9   ]   +   )       (   .
0000100   *   )   _   \   3   -   \   2   -   \   1       \   4   _   /
0000120   '   ` 342 200 235  \n
0000126

答案 1 :(得分:1)

您可以使用:

for i in Photo*; do
    mv "$i" "$(sed -E 's/^Photo ([0-9]*)-([0-9]*)-([0-9]*) (.*)$/20\3-\2-\1 \4/' <<< "$i")"
done