如果名称以年份开头,则递归重命名 pdf 文件
Rename pdf files recursively if their names begin with a year
有人询问并回答了与我类似的问题(例如 here)。这个更具体一点:
我在许多专用文件夹中有很多 pdf 文件,其中只有一些文件的名称是这样的 YEAR_Author(s)Name(s).pdf
(例如,2011_Smith.pdf, 2011_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>(...)
中捕获的任何内容 - 它们是 “捕获组”。
有人询问并回答了与我类似的问题(例如 here)。这个更具体一点:
我在许多专用文件夹中有很多 pdf 文件,其中只有一些文件的名称是这样的 YEAR_Author(s)Name(s).pdf
(例如,2011_Smith.pdf, 2011_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>(...)
中捕获的任何内容 - 它们是 “捕获组”。