在Mac上批量重命名文件的正则表达式

3
我正在尝试批量重命名PDF文件,以便在Mac OS上从右到左删除所有字符,直到找到一个数字字符。例如:
10002ASmith.pdf > 10002.pdf
1023AJones.pdf > 1023.pdf
文件开头的数字长度是可变的,因此我认为最好使用正则表达式从右到左重命名,直到找到一个数字。
我知道Mac Yosemite带有批量重命名功能,但没有看到正则表达式重命名选项。在终端中是否容易完成此操作,如果是,请告诉我如何操作,或者是否有免费软件可以使用正则表达式?
我想我只需要知道实际的正则表达式是什么,因为我对正则表达式远不熟悉。
先谢谢您的帮助!
Jon
4个回答

8

NameChanger听起来很适合这个用途-它是免费的,并且会在应用之前预览建议的批量正则表达式重命名。

在下面的示例中,我使用了正则表达式^(\d+).*,并替换为$1.pdf

regex rename


5
我建议使用shell和find以及sed来完成,但是比@anubhava提出的方法更简单。不过请注意,当文件名中有空格时,该方法将无法正常工作。处理带有空格文件名的版本会稍微复杂一些。
find . -maxdepth 1 -name '*.pdf' | while read filename; do newfilename=`echo $filename | sed '/[0-9]/s/[^0-9]*\.pdf/.pdf/'`; echo mv $filename $newfilename; done

解释:

  • find . -maxdepth 1 -name '*.pdf' — 查找当前目录下所有的 .pdf 文件;
  • while read filename; do + done — 循环遍历 find 命令返回的结果(每一行保存在 filename 变量中);
  • /[0-9]/s/[^0-9]*\.pdf/.pdf/ — 这是“重头戏”部分。它包含正则表达式地址 /[0-9]/ (表示“只在文件名包含数字时应用以下命令”)和 s 命令;
  • s 表达式本身为 s/[^0-9]*\.pdf$/.pdf/,意思是“查找尽可能多的非数字字符,后面跟着 .pdf 和文件名末尾,并将其更改为 .pdf”;
  • 命令替换允许我们创建 newfilename 内容。

通过管道将提议的命令输出到终端上。如果你满意结果,可以将其重新运行并将输出导入 shell 命令,例如

find . -maxdepth 1 -name '*.pdf' | while read filename; do newfilename=`echo $filename | sed '/[0-9]/s/[^0-9]*\.pdf/.pdf/'`; echo mv $filename $newfilename; done | bash

如果您使用的是bash


1
感谢您的解释,@werkritter! - Jibes
最佳解决方案!干得好!我从未使用过/s/表达式,但简而言之,它表示用最终术语(斜杠之间的术语)替换下一个术语(斜杠之间的术语)。在我的情况下,我有100个文件,其中包含要删除的相同文本后跟Some Name:SomeName_same_text.jpg,因此我使用了/s/_same_text.jpg/.jpg/。 - Scott

2
你可以使用 sed 命令中的 find 功能:
cd to /path/of/pdfs

while IFS= read -rd '' line; do
   echo mv "$line" $(sed 's~\./[a-zA-Z]*\([0-9]*[a-zA-Z]\).*\(\.pdf\)$~\1\2~' <<< "$line")
done < <(find . -maxdepth 1 -regex '\./[a-zA-Z]*[0-9]*[a-zA-Z]\{1,\}\.pdf$' -print0)

在确认其工作正常后,移除echo


1
你说得对,我改正了。但是你确定是特别需要 IFS= 吗?我试过没有 IFS= 但使用 -d '' 选项的 read 命令也可以工作。 - werkritter
1
感谢@anubhava提供的解决方案 - 它完美地解决了问题,我很感激您的快速响应! - Jibes
@anubhava,最后一个问题 - 是否有可能去掉出现的任何前缀字母?例如:HD100ASmith.pdf > 100.pdf?谢谢! - Jibes
@anubhava 感谢您的回复 - 不幸的是,由于要保持唯一性的文件数量很多,我必须重命名以保留所有数字和仅右侧的第一个字母,例如:43ASmith.pdf > 43A.pdf 或 HD417ALin > 417A.pdf -- 再次感谢您,我非常感激您的帮助。 - Jibes
1
@anubhava 这太完美了!非常感谢您的帮助,我非常感激您抽出时间来这样做。 - Jibes
显示剩余4条评论

0
我会使用renamer来批量重命名文件,它支持使用正则表达式进行重命名。
$ renamer --find '/(\d+).*/' --replace '$1' --path-element name --dry-run *

Dry run

✔︎ 10002ASmith.pdf → 10002.pdf
✔︎ 10230CJones.pdf → 10230.pdf

Rename complete: 2 of 2 files renamed.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接