在Mac OS X上批量重命名屏幕截图



自定义批量重命名文件

你好,Mac OS X以很长的文件名格式拍摄屏幕截图。我想重命名路径/Users/me/desktop中的任何一个。

以下是一些文件名示例:

Screen Shot 2012-08-02 at 1.15.29 AM.png
Screen Shot 2012-08-02 at 1.22.12 AM.png
Screen Shot 2012-08-02 at 1.22.14 PM.png
Screen Shot 2012-08-02 at 1.22.16 PM.png

有一次我被告知,不要对ls进行for循环,所以这次我试着环球球。到目前为止,这是我所能想到的,但我知道如何用karen包装表达式,然后以我想要的格式将其重命名为文件:

 for i in *; do
      screen_name=$(echo $i | grep --only-matching --extended-regexp '(Screen Shot) [0-9]+-[0-9]+-[0-9]+ at [0-9]+.[0-9]+.[0-9]+.[AP]M.png');
      echo $screen_name;
 done

我不确定时间的小时数,假设所有时间块上可能有2位数字可能是最安全的,因此1.14.29和01.15.29

ss.08-02-12-01.15.29-AM.png
ss.08-02-12-01.22.12-AM.png
ss.08-02-12-01.22.14-PM.png
ss.08-02-12-01.22.16-PM.png

最终目标是一个bash脚本,运行时会将上述路径上的所有文件重命名为列出的新格式。

谢谢你的帮助。

for i in "Screen Shot"*.png; do
    new=`echo $i |awk '
        {
            split($3,a,"-")
            split($5,b,".")
            printf("ss.%s-%s-%s-%02d.%02d.%02d-%s",a[2],a[3],a[1],b[1],b[2],b[3],$6)
        }
    '`
    mv "$i" $new
done

之前:

Screen Shot 2012-08-02 at 1.22.16 PM.png
Screen Shot 2012-09-02 at 13.42.06 PM.png

之后:

ss.08-02-2012-01.22.16-PM.png
ss.09-02-2012-13.42.06-PM.png

编辑:正如steve 所建议的

printf("ss.%s-%s-%s-%02d.%02d.%02d-%s",a[2],a[3],substr(a[1]3,2),b[1],b[2],b[3],$6)

产生

ss.08-02-12-01.22.16-PM.png
ss.09-02-12-13.42.06-PM.png

您可以使用流编辑器sed来匹配和替换正则表达式。你会做一些类似的事情

echo $i | sed "s/PATTERN/REPLACE/"

从$i中生成文件名sed将从stdin读取,搜索(s命令)模式并用replace替换它。

在REGEXP模式中,您可以通过用括号()包围单独的组来标记它们,在大多数情况下,您必须用转义它们,并使用#在替换模式中访问这些部分,其中#是从1开始的子组的编号。这里有一个简单的例子:

echo "ScreenShotXYZ.png" | sed "s/ScreenShot(.*).png/1.png/"

这里,XYZ由括号中的表达式匹配,可以使用replacment字符串中的\1访问。因此,整个模式被XYZ.png 取代

因此,使用正则表达式进行匹配,在相关块周围放上括号,然后执行类似的操作

ss.1.2.(and so on)

用于您的替换模式。仍然有一些方法可以优化流程,首先使用sed将破折号替换为点,然后将整个时间块分组为一种模式,但首先,这样编码更容易。

最新更新