【问题标题】:Batch rename files regular expression on Mac在 Mac 上批量重命名文件正则表达式
【发布时间】:2015-07-20 16:16:17
【问题描述】:

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

例如:

10002ASmith.pdf > 10002.pdf

1023AJones.pdf > 1023.pdf

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

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

我想我只需要知道实际的正则表达式是什么,因为我对正则表达式的经验还很远。

提前感谢您的帮助!

乔恩

【问题讨论】:

    标签: regex macos


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您可以将此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 在您确认它正常工作后。

      【讨论】:

      • 呃,你在find中使用了-print0谓词,但是之后不处理,所以命令不起作用。
      • 你说得对,我的立场是正确的。但是你确定它是IFS=吗?我尝试了 read 没有 IFS= 但使用 -d '' 选项,它确实有效。
      • 您能提供一个需要IFS= 的案例吗?我运行了以下命令,在目录中有 .pdf 带有空格的文件:find . -maxdepth 1 -name '*.pdf' -print0 | while read -d '' line; do echo $line; done 并在单独的行上打印整个文件名。那么适当的引用还不够吗?
      • 感谢@anubhava 提供的这个解决方案 - 这非常有效,我很欣赏快速响应!
      • @anubhava 这太完美了!非常感谢您的热心帮助,非常感谢您抽出宝贵时间。
      【解决方案3】:

      我建议在 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 内容。

      管道会将建议的命令回显到终端。如果您对结果感到满意,您可以将输出通过管道传输到 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

      【讨论】:

      • 感谢@werkritter 的解释!
      【解决方案4】:

      我会使用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.
      

      【讨论】:

        猜你喜欢
        • 2018-12-05
        • 2018-06-14
        • 2017-07-31
        • 2020-08-15
        • 2012-05-26
        • 1970-01-01
        • 2016-08-22
        • 2020-08-13
        • 2020-10-18
        相关资源
        最近更新 更多