我想编写一个 bash 脚本来定期重命名传入的 PDF 出版物。
下载 PDF 时,其文件名格式如下:
<Pub.Name>-<Day>.<Spelled Month>.<Year>.pdf
例如New.Globe-01.October.2020.pdf
。我想创建一个 bash 脚本,将这些 pdf 重命名为格式<Year>-<Numeric Month>-<Day>_<Pub.Name>.pdf
,例如:2020-10-01_New.Globe.pdf
。我知道命令sed
和mv
可能对此有用,但我仍在学习,因此尚不知道如何编写它。任何建议都非常感谢。
答案1
接下来是“简单”的 bash 命令;以便新手也能理解。
下面的 bash 脚本将对一个文件名进行名称转换,并显示 mv 命令以实际执行重命名。
“仅显示”是因为转换尚未经过彻底测试。
如何使用:
将脚本保存在 $HOME 文件夹中作为“script”,
cd 到包含 pdf 文件的文件夹,
然后执行
$ find *.pdf -maxdepth 0 -type f -print0 | while IFS= read -r -d $'\0' f ; 执行 . ~/script "$f" ; 完成
...您将获得一份需要检查的 mv 命令列表。
如果所有命令都是您想要的,那么将其附加| bash
到它上面,它就会真正执行重命名。
剧本:
/bin/bash #!/bin/bash # 捕获脚本的第一个参数... name=$1 # 例如“New.Globe-01.October.2020.pdf” # 用空格替换 .,以允许 'date' 命令解析日期, newname="$(echo "$name" | sed -re 's/\./ /g')" # 将所有‘End-’替换为“30:th” newname="$(echo "$newname" | sed -re 's/[Ee]nd-/30 /')" # 重新排序日期和名称,以“-”分隔,保留文件扩展名,准备进行日期转换 newname="$(echo "$newname" | sed -re 's/^(.*)-(.*) ([^ ]+)$/echo "$(date -d"\2" -I)_\1".\3/')" # 管道到 bash 进行实际的日期转换 newname="$(echo "$newname" | bash )" # 用 _ 替换剩余空格 newname="$(echo "$newname" | sed -re 's/ /_/g')" # 显示重命名的方式 echo "mv \"$name\" \"$newname\"" # mv "$name" "$newname" # 实际的 mv...
参考:
https://tldp.org/guides.html - bash 指南
https://www.tutorialspoint.com/unix/unix-regular-expressions.htm- 上面 sed 中的 regexp:es 用法,@“替换命令”
答案2
以下是一种方法:
#!/bin/sh
pubname='([^-]+)'
day='([0-9]+)'
month='([^\.]+)'
year='([0-9]{4})'
for f in *.pdf
do
newname=$(echo $f | sed -E "s/^$pubname-$day\.$month\.$year\.pdf$/\4-\3-\2_\1/")
mv $f $newname
done
但是,请注意,如果您的任何文件名包含空格,此操作将会失败!