如果名称以年份开头,则递归重命名 pdf 文件

Rename pdf files recursively if their names begin with a year

有人询问并回答了与我类似的问题(例如 here)。这个更具体一点:

我在许多专用文件夹中有很多 pdf 文件,其中只有一些文件的名称是这样的 YEAR_Author(s)Name(s).pdf(例如,2011_Smith.pdf2011_SmithWesson.pdf),其他的都是这样命名的Author(s)Name(s)2011.pdf(例如,Smith2011.pdf,SmithWesson2011.pdf)。后者是我首选的名称格式。我想将所有文件重命名为该格式。按照前面的例子:

2011_Smith.pdf -> Smith2011.pdf
2011_SmithWesson.pdf -> SmithWesson2011.pdf

有没有办法递归地(巧妙地)更改这些文件名。你需要 brew rename 才能做到这一点吗?我在 macOS 上。

好吧,我花了一些时间思考这个问题,并尝试使用 Apple 提供的生锈的旧工具(bash v3.3,sed 古老的,和过时 find) 而不是引入新的依赖项。

让我们逐步执行此操作:

  • 找到文件
  • 遍历它们
  • 做出改变
  • 检查更改并进行更改

首先是识别您的文件。我认为以下应该找到所有以 4 位数字开头后跟下划线的 PDF:

find /Users/YOURUSER  -iregex ".*/[0-9][0-9][0-9][0-9]_.*\.pdf" 2> /dev/null

如果这是正确的,让我们将其通过管道传输到 while 循环中并检查看起来是否正确:

find /Users/YOURUSER  -iregex ".*/[0-9][0-9][0-9][0-9]_.*\.pdf" -print0 2> /dev/null | 
   while IFS= read -r -d $'[=11=]' path; do
      print "$path"
   done

现在看看我们是否可以把你的年份从前面改到后面:

#!/bin/bash

find /Users/YOURUSER  -iregex ".*/[0-9][0-9][0-9][0-9]_.*\.pdf" -print0 2> /dev/null | 
   while IFS= read -r -d $'[=12=]' path; do
      d=$(dirname  "$path")
      f=$(basename "$path")
      # Strip trailing PDF extension case insensitively and swap 4-digit year followed by underscore, space or dash, from front to back
      f=$(echo "$f" | sed -E 's/\.pdf$//i; s/^([0-9]{4})[_ -](.*)//')
      new="${d}/${f}.pdf"
      echo "$path becomes"
      echo "-> $new"
      # mv "$path" "$new"
   done

如果您系统上的文件看起来一切正常,请先进行 TimeMachine 备份,然后通过删除开头的 # 和再次 运行 取消注释倒数第二行。

如果您不熟悉 sed</code> 指的是替换左侧第一组 <code>(...)</code> 中捕获的任何内容指的是在第二组 <code>(...) 中捕获的任何内容 - 它们是 “捕获组”