我有一个程序,它会定期下载某些 PDF 格式的出版物,以及我不需要的其他文件(例如 *.nfo)。该程序将传入的文件放置在目录中以 PDF 文件命名的子目录中,~/Incoming
例如~/Incoming/New.Globe-01.October.2020/New.Globe-01.October.2020.pdf
下载的 PDF 具有以下格式的文件名<Pub.Name>-<Day><Spelled Month><Year>.pdf
,例如:New.Globe-01.October.2020.pdf
,或<Pub.Name>-<Spelled Month><Year>.pdf
,例如:Days.End-September.2020.pdf
。我希望创建一个 bash 脚本,该脚本将定期扫描~/Incoming
目录和所有子目录(最有可能使用 cron)以查找新 PDF,然后将这些 pdf 重命名为格式<Year>-<Numeric Month>-<Day>_<Pub.Name>.pdf
,例如:2020-10-01_New.Globe.pdf
,然后根据文件名(即出版物标题)将 PDF 移动到特定的出版物目录。例如,所有名称包含名称的 PDFNew.Globe
都应移动到目录~/Publications/New_Globe
,而所有包含的 PDFDays.End
都应移动到目录~/Publications/Days_End/
。然后,我想删除任何剩余的文件(例如 *.nfo)和 ~Incoming 中的剩余目录。
感谢 hannu,到目前为止,我已将我的脚本包含在下方。这适用于所有文件名格式为 的出版物<Pub.Name>-<Day><Spelled Month><Year>.pdf
,但我想知道是否有办法让它同时适用于具有该格式的出版物以及文件名中没有日期的出版物,格式为<Pub.Name>-<Spelled Month><Year>.pdf
。我意识到这可能是不可能的,我可能只需要一个不同的脚本,但我想我会问是否有人知道它可能起作用的方法。
我还不确定如何以递归方式删除已成功删除和排序 PDF 的目录(以及其中的任何剩余文件),而不冒着删除所有目录的风险~/Incoming
。
#!/bin/bash
INPUT=~/Incoming
OUTPUT=~/Publications/
find "$INPUT" "*.pdf" -type f -print0 | while IFS= read -r -d $'\0' f ; do
name=$f
newname="$(echo "$name" | sed -re 's/\./ /g')"
newname="$(echo "$newname" | sed -re 's/^(.*)-(.*) ([^ ]+)$/echo "$(date -d"\2" -I)_\1".\3/')"
newname="$(echo "$newname" | bash )"
newname="$(echo "$newname" | sed -re 's/ /_/g')"
mv "$name" "$newname"
done
find "$INPUT" -type f -name "*.pdf" | while IFS= read -r filename; do
case $filename in
*New.Globe*) mv "$(basename "$filename")" "$OUTPUT/New_Globe/" ;;
*Days.End*) mv "$(basename "$filename")" "$OUTPUT/Days_End/" ;;
*) echo "don't know where to put $filename";;
esac
done
非常感谢任何建议或意见。