Mac 终端批处理文件重命名:翻转字符串和数字
Mac Terminal batch file rename: flip string and digits
我在 Mac OS X Terminal 中阅读了一些关于批量重命名的帖子,我知道你可以这样做:
for file in *.pdf
do
mv "$file" "<some magic regex>"
done
如您所料,我的问题是针对此特定目的的正则表达式:
旧文件
作者-年份-Title.pdf
新建文件
年份-作者-Title.pdf
我确实尝试了一些正则表达式代码,但卡住了。我 "just" 想翻转作者和年份,但不知道如何。任何帮助将不胜感激。
这将完成或接近完成您的要求。我使用的技术称为 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
提取到变量中,然后您可以按照您喜欢的任何顺序将它们放在一起,并使用您喜欢的任何分隔符最后并进行实际的重命名。请注意,在您删除 mv
命令前面的 echo
语句之前,该脚本实际上什么都不做,因此您可以对其进行测试,看看它会做什么。
请在备用临时目录中复制您的数据进行练习。
示例输出
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})-(.*)\.*/--.pdf/' <<< $file)
echo $new
done
s/xxx/yyy/
的意思是用yyy
替换或替换xxx
。括号内的任何内容都必须捕获为 capture groups
,然后第一个捕获组在替换中变为可用的 </code>,第二个捕获组变为可用的 <code>
,依此类推。所以它说...将第一个破折号之前的所有内容保存为 </code>,将下一对破折号之间的恰好 4 位数字保存为 <code>
,将其他内容保存为
,然后打印捕获的组以不同的顺序输出。
我在 Mac OS X Terminal 中阅读了一些关于批量重命名的帖子,我知道你可以这样做:
for file in *.pdf
do
mv "$file" "<some magic regex>"
done
如您所料,我的问题是针对此特定目的的正则表达式:
旧文件 作者-年份-Title.pdf
新建文件 年份-作者-Title.pdf
我确实尝试了一些正则表达式代码,但卡住了。我 "just" 想翻转作者和年份,但不知道如何。任何帮助将不胜感激。
这将完成或接近完成您的要求。我使用的技术称为 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
提取到变量中,然后您可以按照您喜欢的任何顺序将它们放在一起,并使用您喜欢的任何分隔符最后并进行实际的重命名。请注意,在您删除 mv
命令前面的 echo
语句之前,该脚本实际上什么都不做,因此您可以对其进行测试,看看它会做什么。
请在备用临时目录中复制您的数据进行练习。
示例输出
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})-(.*)\.*/--.pdf/' <<< $file)
echo $new
done
s/xxx/yyy/
的意思是用yyy
替换或替换xxx
。括号内的任何内容都必须捕获为 capture groups
,然后第一个捕获组在替换中变为可用的 </code>,第二个捕获组变为可用的 <code>
,依此类推。所以它说...将第一个破折号之前的所有内容保存为 </code>,将下一对破折号之间的恰好 4 位数字保存为 <code>
,将其他内容保存为 ,然后打印捕获的组以不同的顺序输出。