用于更改文件名的Applescript

时间:2015-01-22 21:58:50

标签: automation applescript filenames rename finder

我想用一个AppleScript改变数千个文件名。

文件名都是以这种方式制作的:

firstPart - secondPart XX.xxx

XX为某个数字,.xxx为jpg或png扩展名。

我想简单地更改周围的部分,以便它成为:

secondPart - firstPart XX.xxx

我想出了这个,但我的编码技巧让我失望。

tell application "Finder" to set aList to every file in folder "ImageRename"
set text item delimiters to {" - ", "."}
repeat with i from 1 to number of items in aList
    set aFile to (item i of aList)
    try
        set fileName to name of aFile
        set firstPart to text item 1 of fileName
        set secondPart to text item 2 of fileName
        set thirdPart to text item 3 of fileName
        set newName to secondPart & " - " & firstPart & "." & thirdPart
        set name of aFile to newName
    end try
end repeat

这只适用于第二部分的数字。 所以它变成了:

SecondPart XX - firstPart.xxx

如何将两个整数作为文本项分隔符?

请帮助我并一路教我: - )

2 个答案:

答案 0 :(得分:3)

回答你的问题如何使用整数作为文本项分隔符只是:

set AppleScript's text item delimiters to {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}

您可以一次设置多个文本项分隔符,但问题是当使用多个文本项分隔符时,您实际上不知道两个文本项之间的内容。此外,使用文本项分隔符时,分隔符在文本中的显示顺序并不重要。因此,我建议使用正则表达式,您可以定义某种格式,而不是分隔字符串并猜测哪个字符实际上是分隔符。

tell application "Finder" to set aList to every file in folder "ImageRename"
repeat with i from 1 to number of items in aList
   set aFile to item i of aList
   set fileName to name of aFile as string
   set newName to do shell script "perl -pe 's/^(.*) - (.*) ([0-9]{2}\\.(jpeg|png))$/\\2 - \\1 \\3/i' <<<" & quoted form of fileName
   if newName is not fileName then set name of aFile to newName
end repeat

我使用perl而非sed的原因是因为perl支持替换中的I标志,这使得表达式的比较不区分大小写。

修改(请求说明): 旧字符串的格式如下:字符串可以以任何字符(^。*)开头,直到文字字符串“ - ”( - ),然后再跟随任何字符(。*)。该字符串必须以一个以空格和2位数字开头的字符串结尾([0-9] {2}),后跟一个文字句点(\。),并以jpeg或png结尾((jpeg | png)$)。如果我们把这一切放在一起,我们得到一个像“^。* - 。* [0-9] {2} \。(jpeg | png)$”这样的正则表达式。但我们希望将匹配分组到不同的部分,并以不同的顺序将它们作为新字符串返回。因此,我们通过放置括号将正则表达式分为3个不同的子匹配:

^(.*) - (.*) ([0-9]{2}\.(jpeg|png))$

第一组将匹配firstPart,第二组将匹配secondPart,第三组(XX.xxx)将匹配剩余部分。我们唯一需要做的就是在返回新字符串时对它们进行重新排序。新字符串中的反斜杠后跟一个数字将被匹配组替换。在替换命令中,这将被标记为/ s / search / \ 2 - \ 1 \ 3 / flags。

我们替换的最后一部分是一些标志,我将I作为不区分大小写匹配的标志。

把这一切放在一起让我

s/^(.*) - (.*) ([0-9]{2}\.(jpeg|png))$/\2 - \1 \3/I

注意:因为\在Apple脚本中是一个特殊字符,我们必须将\下写为\\

答案 1 :(得分:1)

只需使用空格作为分隔符并构建零件。 编辑:允许文本部分中的空格。

tell application "Finder" to set aList to every file in folder "ImageRename"
set AppleScript's text item delimiters to " "
repeat with i from 1 to number of items in aList
    set aFile to (item i of aList)
    try
        set fileName to name of aFile
        set lastParts to text item -1 of fileName
        set wordParts to (text items 1 thru -2 of fileName) as string
        set AppleScript's text item delimiters to " - "
        set newName to {text item 2 of wordParts, "-", text item 1 of wordParts, lastParts}
        set AppleScript's text item delimiters to " "
        set name of aFile to (newName as string)
    end try
end repeat
set AppleScript's text item delimiters to ""