0

自定义批量重命名文件

您好,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

曾经有人告诉我,不要针对 an 执行 for 循环,ls所以这次我尝试使用 globbing。到目前为止,这就是我所能想到的,但我知道如何包装表达式,然后以我想要的格式将其重命名为文件:

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

感谢您的任何帮助。

4

2 回答 2

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

编辑: 正如史蒂夫建议的那样

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
于 2012-08-02T10:13:24.123 回答
0

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

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

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

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

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

在这里,XYZ 由括号中的表达式匹配,并且可以使用替换字符串中的 \1 访问。整个图案因此被 XYZ.png 取代。

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

ss.\1.\2.(and so on)

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

于 2012-08-02T09:44:34.237 回答