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

时间:2012-08-02 09:23:53

标签: regex bash grep

自定义批量重命名文件

您好,Mac OS X以非常长的文件名格式拍摄屏幕截图。我想重命名位于路径/用户/我/桌面的任何一个。

以下是文件名的一些示例:

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循环,所以这次我正在尝试使用。到目前为止,这是我能想到的全部内容,但已知道如何将表达式包装起来然后以我想要的格式重命名为文件:

 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脚本,运行时会将上述路径中的所有文件重命名为列出的新格式。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您可以使用流编辑器 sed 来匹配并使用正则表达式替换。你会做这样的事情

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

从$ i生成文件名。 sed 将从stdin读取,搜索( s 命令)获取模式并将其替换为REPLACE。

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

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

这里,XYZ与括号中的表达式匹配,可以使用替换字符串中的\ 1进行访问。整个模式因此被XYZ.png。

取代

因此,使用正则表达式进行匹配,在相关块周围放置括号,并执行类似

的操作
ss.\1.\2.(and so on)

替换你的模式。还有一些方法可以优化这个过程,首先使用sed用点替换破折号,然后将整个时间块分组为一个模式,但是一开始就更容易编码。