2015-07-20 96 views
2

我试图批量重命名PDF文件以从右向左移除所有字符,直到在Mac OS上达到数字字符。在Mac上批量重命名文件正则表达式

例如:

10002ASmith.pdf> 10002.pdf

1023AJones.pdf> 1023.pdf

中的文件的开头的数字长度是可变的,所以我图将是​​最好的将正则表达式从右向左重命名,直到达到数字。

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

我想我只需要知道实际的正则表达式会是什么,因为我在正则表达式方面经验不足。

感谢您提前帮忙!

乔恩

回答

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你确认这是工作后。

+0

呃,你在'find'中使用'-print0'谓词,但之后不处理,所以这个命令不起作用。 – werkritter

+1

你说得对,我站好了。但是你确定它确实是'IFS ='吗?我尝试'阅读'没有'IFS =',但'-d'''选项,它确实工作。 – werkritter

+0

你能否提供一个需要'IFS ='的情况?我运行了下面的命令,在目录中有'.pdf'文件,其中包含空格:'find。 -maxdepth 1 -name'* .pdf'-print0 |同时读-d''行;做echo $ line;完成“,并在单独的行上打印整个文件名。所以不适合引用就足够了? – werkritter

0

我会建议在shell中使用findsed,但以@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内容。

流水线会将建议的命令回显给终端。如果你对结果满意,你可以,如果你使用bash与管道输出到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 

+1

谢谢你的解释@werkritter! – Jibes