我正在尝试批量重命名PDF文件以从右到左删除所有字符,直到在Mac OS上到达数字字符。
例如:
10002ASmith.pdf> 10002.pdf
1023AJones.pdf> 1023.pdf
文件开头的数字长度是可变的,所以我认为最好从右到左重命名,直到达到一个数字。
我知道Mac Yosemite具有批量重命名功能,但没有看到正则表达式重命名选项。在终端中执行此操作是否容易?如果是这样,或者是否有可用于使用正则表达式的免费程序?
我想我只需要知道实际的正则表达式是什么,因为我远没有正则表达式。
提前感谢您的帮助!
乔恩
答案 0 :(得分:3)
我建议使用find
和sed
在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)
您可以将此find
与sed
:
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)
答案 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.