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

时间:2015-07-20 16:16:17

标签: regex macos

我正在尝试批量重命名PDF文件以从右到左删除所有字符,直到在Mac OS上到达数字字符。

例如:

10002ASmith.pdf> 10002.pdf

1023AJones.pdf> 1023.pdf

文件开头的数字长度是可变的,所以我认为最好从右到左重命名,直到达到一个数字。

我知道Mac Yosemite具有批量重命名功能,但没有看到正则表达式重命名选项。在终端中执行此操作是否容易?如果是这样,或者是否有可用于使用正则表达式的免费程序?

我想我只需要知道实际的正则表达式是什么,因为我远没有正则表达式。

提前感谢您的帮助!

乔恩

4 个答案:

答案 0 :(得分:3)

我建议使用findsed在shell中进行,但是以@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 :(得分:1)

您可以将此findsed

一起使用
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

答案 2 :(得分:0)

NameChanger听起来很适合此目的-它是免费的,并且将在应用前预览建议的批处理正则表达式重命名。

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

regex rename

答案 3 :(得分: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.