Regex Mac上的批重命名文件正则表达式
我正在尝试批量重命名PDF文件,以从右向左删除所有字符,直到在Mac OS上找到一个数字字符为止 例如: 10002ASmith.pdf>10002.pdf 1023AJones.pdf>1023.pdf 文件开头的数字长度是可变的,所以我认为最好让regex从右向左重命名,直到达到一个数字为止 我知道Mac Yosemite具有批量重命名功能,但没有看到正则表达式重命名选项。在终端上这么做容易吗?如果是的话,怎么做?或者有一个免费的程序可以用来使用正则表达式吗 我想我只需要知道实际的正则表达式是什么,因为我对正则表达式还远没有经验 提前感谢您的帮助Regex Mac上的批重命名文件正则表达式,regex,macos,Regex,Macos,我正在尝试批量重命名PDF文件,以从右向左删除所有字符,直到在Mac OS上找到一个数字字符为止 例如: 10002ASmith.pdf>10002.pdf 1023AJones.pdf>1023.pdf 文件开头的数字长度是可变的,所以我认为最好让regex从右向左重命名,直到达到一个数字为止 我知道Mac Yosemite具有批量重命名功能,但没有看到正则表达式重命名选项。在终端上这么做容易吗?如果是的话,怎么做?或者有一个免费的程序可以用来使用正则表达式吗 我想我只需要知道实际的正则表达式
Jon您可以将此
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)
cd到/path/of/pdfs
而IFS=读取-rd''行;做
echo mv“$line”$(sed's~\./[a-zA-Z]*\([0-9]*[a-zA-Z]\).\(\.pdf\)$\1\2~”我建议在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-名称'*.pdf'
-打印当前目录中的所有.pdf
文件
读取文件名时;执行
+完成
-循环,将对查找
结果中的每一行进行操作(行保存在文件名
变量中)
/[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
听起来很适合此用途-它是免费的,并且将在应用它之前预览建议的批处理正则表达式重命名
在下面的示例中,我使用了正则表达式^(\d+).
,并替换为$1.pdf
我会使用支持使用正则表达式批量重命名文件的
$ 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.
嗯,您在查找中使用-print0
谓词,但之后不处理它,因此该命令不起作用。您是对的,我可以更正。但是您确定它是IFS=
吗?我在没有IFS=
的情况下尝试了读取,但使用了-d'
选项,它确实起了作用。您能提供一个案例吗哪里需要IFS=
?我运行了以下命令,在目录中有带空格的.pdf
文件:find.-maxdepth 1-name'*.pdf'-print0 | while read-d''line;do echo$line;done
,它会在单独的行上打印整个文件名。那么适当的引用是否足够呢?感谢您提供了这个解决方案@a努巴瓦-这非常有效,我感谢您的快速响应!@anubhava这非常完美!非常感谢您的善意帮助,我非常感谢您花时间这么做。感谢您的解释@werkritter!哇!