我在Mac OS X终端上阅读了一些关于批量重命名的主题,并了解到你可以这样做:
for file in *.pdf
do
mv "$file" "<some magic regex>"
done
正如你猜测的那样,我的问题在于这个特殊目的的正则表达式:
旧文件 作者年Title.pdf
新文件 年作者-Title.pdf
我确实尝试了一些正则表达式代码,但卡住了。我只是&#34;想要翻转作者和年份,但无法弄清楚如何。任何帮助将不胜感激。
答案 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
基本上,我正在为您提取Author
,Year
和Title
变量,然后您可以按照您喜欢的顺序将它们放在一起,最后使用您喜欢的任何分隔符并进行实际重命名。请注意,在您删除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/
表示替换或替换 xxx
与yyy
。括号内的任何内容都必须被捕获为capture groups
,然后第一个捕获组在替换中变为\1
,第二个捕获组变为\2
,依此类推。所以它说...将第一个短划线保存为\1
,将下一对破折号中的4个数字保存为\2
,其他内容保存为\3
,然后打印被捕获的群体以不同的顺序出现。