Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Mac上的批重命名文件正则表达式_Regex_Macos - Fatal编程技术网

Regex Mac上的批重命名文件正则表达式

Regex Mac上的批重命名文件正则表达式,regex,macos,Regex,Macos,我正在尝试批量重命名PDF文件,以从右向左删除所有字符,直到在Mac OS上找到一个数字字符为止 例如: 10002ASmith.pdf>10002.pdf 1023AJones.pdf>1023.pdf 文件开头的数字长度是可变的,所以我认为最好让regex从右向左重命名,直到达到一个数字为止 我知道Mac Yosemite具有批量重命名功能,但没有看到正则表达式重命名选项。在终端上这么做容易吗?如果是的话,怎么做?或者有一个免费的程序可以用来使用正则表达式吗 我想我只需要知道实际的正则表达式

我正在尝试批量重命名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!哇!