Mac终端批处理文件重命名:翻转字符串和数字

时间:2015-02-13 11:45:33

标签: regex macos terminal batch-processing

我在Mac OS X终端上阅读了一些关于批量重命名的主题,并了解到你可以这样做:

for file in *.pdf
do
    mv "$file" "<some magic regex>"
done

正如你猜测的那样,我的问题在于这个特殊目的的正则表达式:

旧文件 作者年Title.pdf

新文件 年作者-Title.pdf

我确实尝试了一些正则表达式代码,但卡住了。我只是&#34;想要翻转作者和年份,但无法弄清楚如何。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

这将会或者非常接近你所要求的。我正在使用的技术称为Bash Parameter Substitution,它已被记录并描述得很好here

#!/bin/bash
for file in *.pdf
do
    echo DEBUG: Processing file $file
    f=${file%.*}           # strip extension from right end
    author=${f%%-*}        # shortest str at start that ends with dash
    title=${f##*-}         # shortest str at end that starts with dash
    authoryear=${f%-*}     # longest string at start that ends in dash
    year=${authoryear#*-}
    echo DEBUG: author:$author, year:$year, title:$title
    echo mv "$file" "$year-$author-$title.pdf"
done

基本上,我正在为您提取AuthorYearTitle变量,然后您可以按照您喜欢的顺序将它们放在一起,最后使用您喜欢的任何分隔符并进行实际重命名。请注意,在您删除echo命令前面的mv语句之前,该脚本实际上什么都不做,因此您可以测试它并查看它将执行的操作。

请在备用的临时目录中练习复制数据。

示例输出

DEBUG: Processing file Banks-2012-Something.pdf
DEBUG: author:Banks, year:2012, title:Something
mv Banks-2012-Something.pdf 2012-Banks-Something.pdf
DEBUG: Processing file Shakey-2013-SomethingElse.pdf
DEBUG: author:Shakey, year:2013, title:SomethingElse
mv Shakey-2013-SomethingElse.pdf 2013-Shakey-SomethingElse.pdf

如果您喜欢丑陋的sed命令,可以更简洁地执行此操作:

#!/bin/bash
for file in *.pdf
do
    echo DEBUG: Processing file $file
    new=$(sed -E 's/(.*)-([0-9]{4})-(.*)\.*/\2-\1-\3.pdf/' <<< $file)
    echo $new
done

s/xxx/yyy/表示替换替换 xxxyyy。括号内的任何内容都必须被捕获为capture groups,然后第一个捕获组在替换中变为\1,第二个捕获组变为\2,依此类推。所以它说...将第一个短划线保存为\1,将下一对破折号中的4个数字保存为\2,其他内容保存为\3,然后打印被捕获的群体以不同的顺序出现。