Bash 脚本根据文件名重命名 PDF 文件

Bash 脚本根据文件名重命名 PDF 文件

我想编写一个 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。我知道命令sedmv可能对此有用,但我仍在学习,因此尚不知道如何编写它。任何建议都非常感谢。

答案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

但是,请注意,如果您的任何文件名包含空格,此操作将会失败!

相关内容